Я обрабатываю TreeView
каталоги и файлы. Пользователь может выбрать файл или каталог, а затем что-то сделать с ним. Это требует от меня наличия метода, который выполняет различные действия в зависимости от выбора пользователя.
В данный момент я делаю что-то вроде этого, чтобы определить, является ли путь файлом или каталогом:
bool bIsFile = false;
bool bIsDirectory = false;
try
{
string[] subfolders = Directory.GetDirectories(strFilePath);
bIsDirectory = true;
bIsFile = false;
}
catch(System.IO.IOException)
{
bIsFolder = false;
bIsFile = true;
}
Я не могу не чувствовать, что есть лучший способ сделать это! Я надеялся найти стандартный метод .NET, чтобы справиться с этим, но я не смог этого сделать. Существует ли такой метод, и если нет, то какой самый простой способ определить, является ли путь файлом или каталогом?
Ответы:
От Как сказать , если путь файла или каталога :
Обновление для .NET 4.0+
Согласно комментариям ниже, если вы используете .NET 4.0 или более позднюю версию (и максимальная производительность не критична), вы можете написать код более понятным способом:
источник
&
оператор и вернет двоичное значение, в котором включены только те биты, которые включены (1) в обоих операндах. В этом случае выполнение поразрядно и операция против,attr
иFileAttributes.Directory
значение вернет значение,FileAttributes.Directory
если бит атрибута файла каталога включен. Смотрите en.wikipedia.org/wiki/Bitwise_operation для лучшего объяснения.C:\Temp
относится ли к каталогу с именемTemp
или к файлуTemp
. Что должен делать код?attr.HasFlag(FileAttributes.Directory)
можно использовать вместо.Как насчет использования этих?
источник
File.GetAttributes()
.public static bool? IsDirectory(string path){
if (Directory.Exists(path))
return true; // is a directory
else if (File.Exists(path))
return false; // is a file
else
return null; // is a nothing
}
Только с этой строкой вы можете получить, если путь является каталогом или файлом:
источник
Вот мой:
Это похоже на ответы других, но не совсем то же самое.
источник
Path.DirectorySeparatorChar
иPath.AltDirectorySeparatorChar
В качестве альтернативы Directory.Exists () вы можете использовать метод File.GetAttributes (), чтобы получить атрибуты файла или каталога, чтобы вы могли создать вспомогательный метод, подобный этому:
Вы также можете рассмотреть возможность добавления объекта в свойство тега элемента управления TreeView при заполнении элемента управления, который содержит дополнительные метаданные для элемента. Например, вы можете добавить объект FileInfo для файлов и объект DirectoryInfo для каталогов, а затем проверить тип элемента в свойстве тега, чтобы сохранить выполнение дополнительных системных вызовов для получения этих данных при нажатии на элемент.
источник
isDirectory = (fa & FileAttributes.Directory) != 0);
Это было лучшее, что я мог придумать, учитывая поведение свойств Exists и Attributes:
Вот как это проверяется:
источник
После объединения предложений из других ответов я понял, что придумал то же самое, что и ответ Ронни Оверби . Вот несколько тестов, на которые следует обратить внимание:
C:\Temp\folder_with.dot
Path.DirectorySeparatorChar
иPath.AltDirectorySeparatorChar
)Тесты (Linqpad)
Результаты
метод
источник
Path.DirectorySeparatorChar.ToString()
вместо строки с""
?new String(Path.DirectorySeparatorChar, 1)
то, чтоToString
делает, если хотите действительно оптимизироваться.Наиболее точным подходом будет использование некоторого кода взаимодействия из shlwapi.dll
Затем вы бы назвали это так:
источник
Вот что мы используем:
источник
Я сталкивался с этим, когда сталкивался с подобной проблемой, за исключением того, что мне нужно было проверить, существует ли путь для файла или папки, когда этот файл или папка могут фактически не существовать . Было несколько комментариев к ответам выше, в которых упоминалось, что они не будут работать для этого сценария. Я нашел решение (я использую VB.NET, но вы можете конвертировать, если вам нужно), которое, кажется, хорошо работает для меня:
Надеюсь, это может быть полезно для кого-то!
источник
test.txt
и файл может быть названtest
- в этих случаях ваш код будет давать неправильные результатытааак поздно в игре, я знаю, но думал, что поделюсь этим в любом случае. Если вы работаете исключительно с путями в виде строк, понять это легко, как пирог:
например:
ThePath == "C:\SomeFolder\File1.txt"
будет в конечном итоге это:Другой пример:
ThePath == "C:\SomeFolder\"
в конечном итоге это будет так:И это также будет работать без обратной косой черты:
ThePath == "C:\SomeFolder"
в конечном итоге это будет так:Имейте в виду, что это работает только с самими путями, а не с отношением между путем и «физическим диском» ... поэтому он не может сказать вам, существует ли путь / файл или что-то в этом роде, но он уверен может сказать вам, если путь является папкой или файлом ...
источник
System.IO.FileSystemWatcher
поскольку, когда каталог удаляется, он отправляетc:\my_directory
в качестве аргумента тот же аргумент, что и приc:\my_directory
удалении файла без расширения .GetDirectoryName('C:\SomeFolder')
возвращается'C:\'
, так что ваш последний случай не работает. Это не делает различий между каталогами и файлами без расширений.Path.GetDirectoryName("C:\SomeFolder\SomeSubFolder")
вернетсяC:\SomeFolder
. Обратите внимание, что ваши собственные примеры того, что возвращает GetDirectoryName, показывают, что он возвращает путь, который не заканчивается обратной косой чертой. Это означает, что если кто-то использует GetDirectoryName в другом месте для получения пути к каталогу, а затем передает его в ваш метод, он получит неправильный ответ.Если вы хотите найти каталоги, в том числе помеченные как «скрытые» и «системные», попробуйте это (требуется .NET V4):
источник
Мне это нужно, посты помогли, это сводит их к одной строке, и если путь вообще не путь, он просто возвращает и выходит из метода. Он решает все вышеперечисленные проблемы, также не нуждается в конце.
источник
Я использую следующее, оно также проверяет расширение, которое означает, что его можно использовать для проверки, если указанный путь - это файл, но файл, который не существует.
источник
источник
Используя выбранный ответ в этом посте, я посмотрел комментарии и доверился @ ŞafakGür, @Anthony и @Quinn Wilson за их информационные биты, которые привели меня к этому улучшенному ответу, который я написал и протестировал:
источник
Может быть для UWP C #
источник
Я вижу, я на 10 лет опоздал на вечеринку. Я столкнулся с ситуацией, когда из какого-то свойства я могу получить либо имя файла, либо полный путь к файлу. Если путь не указан, я должен проверить существование файла, прикрепив «глобальный» путь к каталогу, предоставленный другим свойством.
В моем случае
сделал свое дело. Ладно, это не волшебство, но, возможно, это может сэкономить кому-то несколько минут на выяснение. Так как это просто разбор строк, Dir-имена с точками могут давать ложные срабатывания ...
источник
Здесь очень поздно, но я обнаружил, что
Nullable<Boolean>
возвращаемое значение довольно уродливо -IsDirectory(string path)
возвращениеnull
не равнозначно несуществующему пути без подробного комментирования, поэтому я придумал следующее:Этот вспомогательный метод написан, чтобы быть многословным и достаточно кратким, чтобы понять намерение при первом прочтении.
источник
Разве это не сработает?
источник