Лучший способ проверить, является ли путь файлом или каталогом?

Я обрабатываю TreeView каталогов и файлов. Пользователь может выбрать файл или каталог, а затем что-то с ним сделать. Для этого мне необходимо иметь метод, который выполняет различные действия в зависимости от выбора пользователя.

В настоящий момент я делаю что-то вроде этого, чтобы определить, является ли путь файлом или каталогом:

  bool bIsFile = false; bool bIsDirectory = false; попробуйте {string [] подпапки = Directory.GetDirectories (strFilePath);  bIsDirectory = true;  bIsFile = false;} catch (System.IO.IOException) {bIsFolder = false;  bIsFile = true;}  

Я не могу избавиться от мысли, что есть способ сделать это лучше! Я надеялся найти стандартный метод .NET для решения этой проблемы, но мне не удалось этого сделать. Существует ли такой метод, и если нет, то каков самый простой способ определить, является ли путь файлом или каталогом?


От Как определить, является ли путь файлом или directory:

 //получить атрибуты файла для file или directoryFileAttributes attr = File.GetAttributes (@ "c:  Temp");//определить, является ли это каталог или файл, если  ((attr & FileAttributes.Directory) == FileAttributes.Directory) MessageBox.Show ("Это каталог"); else MessageBox.Show ("Это файл");  

Обновление для .NET 4.0+

Согласно комментариям ниже, если вы используете .NET 4.0 или новее (и максимальная производительность не критична), вы можете написать код более чистым способом:

 //получаем атрибуты файла для файла или каталогаFileAttributes attr = File.GetAttributes (@ "c:  Temp"); if (attr.HasFlag (FileAttributes.Directory)) MessageBox.Show  ("Это каталог"); else MessageBox.Show ("Это файл");  

Как насчет их использования?

  F  ile.Exists (); Directory.Exists ();  


Как насчет их использования?

  File.Exists (); Directory.Exists ();  

Только с помощью этой строки вы можете получить, если путь является каталогом или файлом:

  File.GetAttributes (data.Path) .HasFlag (FileAttributes.Directory)  


Только с помощью этой строки вы можете получить, если путь — это каталог или файл:

  File.GetAttributes (data.Path) .HasFlag (FileAttributes.Directory)  

Вот мой:

  bool IsPathDirectory (строковый путь) {if (path == null) throw new ArgumentNullException ("path");  путь = путь.Trim ();  если (Directory.Exists (путь)) вернуть истину;  if (File.Exists (path)) вернуть false; //ни файла, ни каталога не существует.  угадать намерение//если в конце есть косая черта, то это каталог if (new [] {"\", "/"}.Any(x => path. EndsWith (x))) return true; //заканчивается косой чертой//если имеет расширение, то это файл;  каталог, в противном случае вернуть строку.IsNullOrWhiteSpace (Path.GetExtension (path));  }  

Это похоже на ответы других, но не совсем то же самое.


Вот мой:

  bool IsPathDirectory (строковый путь) {if (path == null) throw new ArgumentNullException ("path");  путь = путь.Trim ();  если (Directory.Exists (путь)) вернуть истину;  if (File.Exists (path)) вернуть false; //ни файла, ни каталога не существует.  угадать намерение//если в конце есть косая черта, то это каталог if (new [] {"\", "/"}.Any(x => path.EndsWith (x))) return true; //заканчивается косой чертой//если имеет расширение, то это файл;  каталог, в противном случае вернуть строку.IsNullOrWhiteSpace (Path.GetExtension (path));  }  

Это похоже на ответы других, но не совсем то же самое.


В качестве альтернативы Directory.Exists () вы можете использовать метод File.GetAttributes () для получения атрибутов файла или каталога, чтобы вы могли создать вспомогательный метод, подобный этому:

  private static bool IsDirectory (строковый путь) {System.IO.FileAttributes fa = System.IO.File.GetAttributes (путь);  return (fa & FileAttributes.Directory)! = 0;}  

Вы также можете рассмотреть возможность добавления объекта в свойство tag элемента управления TreeView при заполнении элемента управления, содержащего дополнительные метаданные для пункт. Например, вы можете добавить объект FileInfo для файлов и объект DirectoryInfo для каталогов, а затем проверить тип элемента в свойстве тега, чтобы сохранить дополнительные системные вызовы для получения этих данных при нажатии на элемент.


В качестве альтернативы Directory.Exists () вы можете использовать метод File.GetAttributes () для получения атрибутов файл или каталог, поэтому вы можете создать вспомогательный метод, подобный этому:

  private static bool IsDirectory (строковый путь) {System.IO.FileAttributes fa = System.IO.File  .GetAttributes (путь);  return (fa & FileAttributes.Directory)! = 0;}  

Вы также можете рассмотреть возможность добавления объекта в свойство tag элемента управления TreeView при заполнении элемента управления, содержащего дополнительные метаданные для пункт. Например, вы можете добавить объект FileInfo для файлов и объект DirectoryInfo для каталогов, а затем проверить тип элемента в свойстве тега, чтобы сохранить дополнительные системные вызовы для получения этих данных при нажатии на элемент.


Объединив предложения из других ответов, я понял, что придумал примерно то же, что и ответ Ронни Оверби. Вот несколько тестов, которые помогут вам подумать:

  1. папки могут иметь «расширения»: C: Temp folder_with.dot
  2. файлы не могут заканчиваться разделителем каталогов (косая черта).
  3. Технически существует два разделителя каталогов, которые зависят от платформы, т.е. могут или могут не быть косой чертой ( Path.DirectorySeparatorChar и Path.AltDirectorySeparatorChar)

Тесты (Linqpad )

  var paths = new [] {//существует @ "C:  Temp  dir_test  folder_is_a_dir", @ "C:  Temp  dir_test  is_a_dir_trailing_slash ",  @ "C:  Temp  dir_test  existing_folder_with.ext", @ "C:  Temp  dir_test  file_thats_not_a_dir", @ "C:  Temp  dir_test  notadir.txt",//не существует @ "C:   Temp  dir_test  dne_folder_is_a_dir ", @" C:  Temp  dir_test  dne_folder_trailing_slash  ", @" C:  Temp  dir_test  non_existing_folder_with.ext ", @" C:  Temp  dir_test  dne_not_filea "  :  Temp  dir_test  dne_notadir.txt ",}; foreach (путь к переменной в путях) {IsFolder (путь /*, false */). Дамп (путь);}  

Результаты

  C:  Temp  dir_test  folder_is_a_dir  True C:  Temp  dir_test  is_a_dir_trailing_slash  True C:  Temp  dir_test  existing_folder_with.ext Истинно C:  Temp  dir_test  file_thats_not_a_dir False C:  Temp  dir_test  notadir.txt  notadir_folder  Temp_themp_folse  Temp_Txt False C:  Tempo  True C:  Temp  dir_test  dne_folder_trailing_slash  True C:  Temp  dir_test  non_existing_folder_with.ext False (это странно) C:  Temp  dir_test  dne_file_thats_not_a_dir True C:  Temp  dirsenot_test /code> 

Метод

 //////Является ли  папкой  (существующие или нет); ///необязательно предположим, что если он не "похож" на файл, то это каталог.////// Путь для проверки ///  Если  не существует, выглядит ли он хотя бы как имя каталога?  Например, это не похоже на файл. ///  True , если папка/каталог,  false , если нет. Возвращает  > public static bool IsFolder (строковый путь, bool acceptDneLookAlike = true) {//https://stackoverflow.com/questions/1395205/better-way-to-check-if-path-is-a-file-or-a  -directory//оказывается примерно таким же, как https://stackoverflow.com/a/19596821/1037948//проверка в порядке правдоподобия//существует или заканчивается разделителем каталогов - файлы не могут заканчиваться разделителем каталогов,  правильно?  if (Directory.Exists (path)//используйте системные значения вместо косой черты || path.EndsWith ("" + Path.DirectorySeparatorChar) || path.EndsWith ("" + Path.AltDirectorySeparatorChar)) return true; //если мы точно знаем, что это настоящий файл ... if (File. Существует (путь)) return false; //если у него есть расширение, это должен быть файл, поэтому//наоборот, хотя технически каталоги могут иметь расширения ... if (! Path.HasExtension (path) && acceptDneLookAlike) return true; //работает только для существующих файлов, как бы избыточно с `.Exists` выше//if (File.GetAttributes (path) .HasFlag (FileAttributes.Directory)) ...; //без понятия - может вернуть «неопределенное» значение (nullable bool)//или предположить, что если мы не знаем, то это не папка return false;}  


Объединив предложения из других ответов, я понял, что придумал примерно то же, что и ответ Ронни Оверби. Вот несколько тестов, которые помогут вам подумать:

  1. папки могут иметь «расширения»: C: Temp folder_with.dot
  2. файлы не могут заканчиваться разделителем каталогов (косая черта).
  3. Технически существует два разделителя каталогов, которые зависят от платформы, т.е. могут или могут не быть косой чертой ( Path.DirectorySeparatorChar и Path.AltDirectorySeparatorChar)

Тесты (Linqpad )

  var paths = new [] {//существует @ "C:  Temp  dir_test  folder_is_a_dir", @ "C:  Temp  dir_test  is_a_dir_trailing_slash ",  @ "C:  Temp  dir_test  existing_folder_with.ext", @ "C:  Temp  dir_test  file_thats_not_a_dir", @ "C:  Temp  dir_test  notadir.txt",//не существует @ "C:   Temp  dir_test  dne_folder_is_a_dir ", @" C:  Temp  dir_test  dne_folder_trailing_slash  ", @" C:  Temp  dir_test  non_existing_folder_with.ext ", @" C:  Temp  dir_test  dne_not_filea "  :  Temp  dir_test  dne_notadir.txt ",}; foreach (путь к переменной в путях) {IsFolder (путь /*, false */). Дамп (путь);}  

Результаты

  C:  Temp  dir_test  folder_is_a_dir  True C:  Temp  dir_test  is_a_dir_trailing_slash  True C:  Temp  dir_test  existing_folder_with.ext Истинно C:  Temp  dir_test  file_thats_not_a_dir False C:  Temp  dir_test  notadir.txt  notadir_folder  Temp_themp_folse  Temp_Txt False C:  Tempo  True C:  Temp  dir_test  dne_folder_trailing_slash  True C:  Temp  dir_test  non_existing_folder_with.ext False (это странно) C:  Temp  dir_test  dne_file_thats_not_a_dir True C:  Temp  dirsenot_test /code> 

Метод

 //////Является ли  папкой  (существующие или нет); ///необязательно предположим, что если он не "похож" на файл, то это каталог.////// Путь для проверки ///  Если  не существует, выглядит ли он хотя бы как имя каталога?  То есть не похоже на файл. ///  True  если папка/каталог,  false  если нет.  public static bool IsFolder (string path, bool acceptDneLookAlike =  true) {//https://stackoverflow.com/questions/1395205/better-way-to-check-if-path-is-a-file-or-a-directory//оказывается примерно таким же, как  https://stackoverflow.com/a/19596821/1037948//проверка в порядке правдоподобия//существует или заканчивается разделителем каталогов - файлы не могут заканчиваться разделителем каталогов, верно?  if (Directory.Exists (path)//используйте системные значения вместо косой черты || path.EndsWith ("" + Path.DirectorySeparatorChar) || path.EndsWith ("" + Path.AltDirectorySeparatorChar)) return true; //если мы точно знаем, что это настоящий файл ... if (File.Exists (path)) return false; //если у него есть расширение, это должен быть файл, поэтому//наоборот, хотя технически каталоги могут иметь расширения ... if (! Path.HasExtension (path) && acceptDneLookAlike) return true; //работает только для существующих файлов, как бы избыточно с `.Exists` выше//if (File.GetAttributes (path) .HasFlag (FileAttributes.Directory)) ...; //без понятия - может вернуть 'неопределенное' значение (nullable bool)//или предположить, что если мы не знаем, то это не папка return false;}  

Это было лучшее, что я мог придумать, учитывая поведение свойств Exists и Attributes:

  с использованием System.IO; общедоступный статический класс FileSystemInfoExtensions {//////Проверяет, является ли объект FileInfo или DirectoryInfo каталогом или предназначен для использования в качестве каталога. ////// ///  public static bool IsDirectory (this FileSystemInfo fileSystemInfo) {if (fileSystemInfo == null) {  вернуть ложь;  } if ((int) fileSystemInfo.Attributes! = -1) {//если атрибуты инициализированы, проверьте флаг каталога return fileSystemInfo.Attributes.HasFlag (FileAttributes.Directory);  }//Если мы попали сюда, вероятно, файл еще не существует.  Лучшее, что мы можем сделать, это//попытаться судить о намерениях.  Поскольку каталоги могут иметь расширения, а файлы//могут не иметь их, мы не можем полагаться на имя файла. ////Мы можем разумно предположить, что если путь еще не существует, а//FileSystemInfo - это DirectoryInfo, подразумевается каталог.  FileInfo может//создать каталог, но это был бы странный путь кода.  return fileSystemInfo - DirectoryInfo;  }}  

Вот как это проверяется:

  [TestMethod] public void IsDirectoryTest () {//несуществующий файл  , FileAttributes не является окончательным, полагаться на тип FileSystemInfo const string nonExistentFile = @ "C:  TotallyFakeFile.exe";  var nonExistentFileDirectoryInfo = новый DirectoryInfo (nonExistentFile);  Assert.IsTrue (nonExistentFileDirectoryInfo.IsDirectory ());  var nonExistentFileFileInfo = новый FileInfo (nonExistentFile);  Утверждать. IsFalse (nonExistentFileFileInfo.IsDirectory ()); //несуществующий каталог, атрибуты FileAttributes не являются окончательными, полагаемся на тип FileSystemInfo const string nonExistentDirectory = @ "C:  FakeDirectory";  var nonExistentDirectoryInfo = новый DirectoryInfo (nonExistentDirectory);  Assert.IsTrue (nonExistentDirectoryInfo.IsDirectory ());  var nonExistentFileInfo = новый FileInfo (nonExistentDirectory);  Assert.IsFalse (nonExistentFileInfo.IsDirectory ()); //Существующий, полагаемся на FileAttributes const string existingDirectory = @ "C:  Windows";  var existingDirectoryInfo = новый DirectoryInfo (existingDirectory);  Assert.IsTrue (existingDirectoryInfo.IsDirectory ());  var existingDirectoryFileInfo = новый FileInfo (existingDirectory);  Assert.IsTrue (existingDirectoryFileInfo.IsDirectory ()); //Существующий, полагаемся на FileAttributes const string existingFile = @ "C:  Windows  notepad.exe";  var existingFileDirectoryInfo = новый DirectoryInfo (существующий файл);  Assert.IsFalse (existingFileDirectoryInfo.IsDirectory ());  var existingFileFileInfo = новый FileInfo (существующий файл);  Assert.IsFalse (existingFileFileInfo.IsDirectory ());  }  


Это было лучшее, что я мог придумать, учитывая поведение свойств Exists и Attributes:

  с использованием System.IO; общедоступный статический класс FileSystemInfoExtensions {//////Проверяет, является ли объект FileInfo или DirectoryInfo каталогом или предназначен для использования в качестве каталога. ////// ///  public static bool IsDirectory (this FileSystemInfo fileSystemInfo) {if (fileSystemInfo == null) {  вернуть ложь;  } if ((int) fileSystemInfo.Attributes! = -1) {//если атрибуты инициализированы, проверьте флаг каталога return fileSystemInfo.Attributes.HasFlag (FileAttributes.Directory);  }//Если мы попали сюда, вероятно, файл еще не существует.  Лучшее, что мы можем сделать, это//попытаться судить о намерениях.  Поскольку каталоги могут иметь расширения, а файлы//могут не иметь их, мы не можем полагаться на имя файла. ////Мы можем разумно предположить, что если путь еще не существует, а//FileSystemInfo - это DirectoryInfo, подразумевается каталог.  FileInfo может//создать каталог, но это был бы странный путь кода.  return fileSystemInfo - DirectoryInfo;  }}  

Вот как это проверяется:

  [TestMethod] public void IsDirectoryTest () {//несуществующий файл  , FileAttributes не является окончательным, полагаться на тип FileSystemInfo const string nonExistentFile = @ "C:  TotallyFakeFile.exe";  var nonExistentFileDirectoryInfo = новый DirectoryInfo (nonExistentFile);  Assert.IsTrue (nonExistentFileDirectoryInfo.IsDirectory ());  var nonExistentFileFileInfo = новый FileInfo (nonExistentFile);  Assert.IsFalse (nonExistentFileFileInfo. IsDirectory ()); //несуществующий каталог, атрибуты FileAttributes не являются окончательными, полагаемся на тип FileSystemInfo const string nonExistentDirectory = @ "C:  FakeDirectory";  var nonExistentDirectoryInfo = новый DirectoryInfo (nonExistentDirectory);  Assert.IsTrue (nonExistentDirectoryInfo.IsDirectory ());  var nonExistentFileInfo = новый FileInfo (nonExistentDirectory);  Assert.IsFalse (nonExistentFileInfo.IsDirectory ()); //Существующий, полагаемся на FileAttributes const string existingDirectory = @ "C:  Windows";  var existingDirectoryInfo = новый DirectoryInfo (existingDirectory);  Assert.IsTrue (existingDirectoryInfo.IsDirectory ());  var existingDirectoryFileInfo = новый FileInfo (existingDirectory);  Assert.IsTrue (existingDirectoryFileInfo.IsDirectory ()); //Существующий, полагаемся на FileAttributes const string existingFile = @ "C:  Windows  notepad.exe";  var existingFileDirectoryInfo = новый DirectoryInfo (существующий файл);  Assert.IsFalse (existingFileDirectoryInfo.IsDirectory ());  var existingFileFileInfo = новый FileInfo (существующий файл);  Assert.IsFalse (existingFileFileInfo.IsDirectory ());  }  

Наиболее точным подходом будет использование некоторого кода взаимодействия из файла shlwapi. dll

  [DllImport (SHLWAPI, CharSet = CharSet.Unicode)] [return: MarshalAsAttribute (UnmanagedType.Bool)] [ResourceExposure (ResourceScope.None)] внутренний статический extern bool PathIsDirectory  ([MarshalAsAttribute (UnmanagedType.LPWStr), In] string pszPath);  

Затем вы бы назвали его так:

   #region IsDirectory//////Проверяет, что путь является допустимым каталогом .////// Путь для проверки. /// , если путь является допустимым каталогом; ///в противном случае . //////   . /////////  это  String.Empty . /// public static bool IsDirectory (строковый путь) {return PathIsDirectory (путь);  }  


Наиболее точным подходом будет использование некоторого кода взаимодействия из shlwapi .dll

  [DllImport (SHLWAPI, CharSet = CharSet.Unicode)] [return: MarshalAsAttribute (UnmanagedType.Bool)] [ResourceExposure (ResourceScope.None)] внутренний статический extern bool  PathIsDirectory ([MarshalAsAttribute (UnmanagedType.LPWStr), In] string pszPath);  

Затем вы бы назвали его так:

  #region IsDirectory//////Проверяет, что путь является допустимым каталогом.////// Путь для проверки. /// , если путь является допустимым каталогом; ///в противном случае . //////   . /////////  это  String.Empty . /// public static bool IsDirectory (строковый путь) {return PathIsDirectory (путь);  }  

Вот что мы используем:

  using System; using System.IO; пространство имен crmachine.CommonClasses {общедоступный статический класс CRMPath {public static bool IsDirectory (строковый путь) {if (path == null) {выбросить новое исключение ArgumentNullException ("путь");  } строка причина;  if (! IsValidPathString (путь, причина выхода)) {выбросить новое исключение ArgumentException (причина);  } if (! (Directory.Exists (path) || File.Exists (path))) {throw new InvalidOperationException (string.Format ("Не удалось найти часть пути '{0}'", path));  } return (новый System.IO.FileInfo (путь) .Attributes & FileAttributes.Directory) == FileAttributes.Directory;  } общедоступный статический логический объект IsValidPathString (строка pathStringToTest, исходящая строка reasonForError) {reasonForError = "";  if (string.IsNullOrWhiteSpace (pathStringToTest)) {reasonForError = "Путь равен нулю или пробелам.";  вернуть ложь;  } if (pathStringToTest.Length> CRMConst.MAXPATH)//MAXPATH == 260 {reasonForError = "Длина пути превышает MAXPATH.";  вернуть ложь;  } if (PathContainsInvalidCharacters (pathStringToTest)) {reasonForError = "Путь содержит недопустимые символы пути.";  вернуть ложь;  } if (pathStringToTest == ":") {reasonForError = "Путь состоит только из обозначения тома.";  вернуть ложь;  } if (pathStringToTest [0] == ':') {reasonForError = "Путь начинается с обозначения тома.";  вернуть ложь;  } if (pathStringToTest.Contains (":") && pathStringToTest.IndexOf (':')! = 1) {reasonForError = "Путь содержит указатель тома, который не является частью метки диска.";  вернуть ложь;  } вернуть истину;  } public static bool PathContainsInvalidCharacters (строковый путь) {if (path == null) {выбросить новое исключение ArgumentNullException ("путь");  } bool containInvalidCharacters = false;  for (int i = 0; i  (n == 0x7c) || ​​//| (n  (n == 0x7c) || ​​//| (n == 0x3a) ||//: (n == 0x2a) ||//* (n == 0x3f) || //? (n == 0x5c) || ​​// (n == 0x2f) ||///(n  


Вот что мы используем:

  using System; using System.IO; пространство имен crmachine.CommonClasses {общедоступный статический класс CRMPath {общедоступный статический bool IsDirectory (строковый путь) {if (path == null) {выбросить новое исключение ArgumentNullException ("путь");  } строка причина;  if (! IsValidPathString (путь, причина выхода)) {выбросить новое исключение ArgumentException (причина);  } if (! (Directory.Exists (path) || File.Exists (path))) {throw new InvalidOperationException (string.Format ("Не удалось найти часть пути '{0}'", path));  } return (новый System.IO.FileInfo (путь) .Attributes & FileAttributes.Directory) == FileAttributes.Directory;  } общедоступный статический логический объект IsValidPathString (строка pathStringToTest, исходящая строка reasonForError) {reasonForError = "";  if (string.IsNullOrWhiteSpace (pathStringToTest)) {reasonForError = "Путь равен нулю или пробелам.";  вернуть ложь;  } if (pathStringToTest.Length> CRMConst.MAXPATH)//MAXPATH == 260 {reasonForError = "Длина пути превышает MAXPATH.";  вернуть ложь;  } if (PathContainsInvalidCharacters (pathStringToTest)) {reasonForError = "Путь содержит недопустимые символы пути.";  вернуть ложь;  } if (pathStringToTest == ":") {reasonForError = "Путь состоит только из обозначения тома.";  вернуть ложь;  } if (pathStringToTest [0] == ':') {reasonForError = "Путь начинается с обозначения тома.";  вернуть ложь;  } if (pathStringToTest.Contains (":") && pathStringToTest.IndexOf (':')! = 1) {reasonForError = "Путь содержит указатель тома, который не является частью метки диска.";  вернуть ложь;  } вернуть истину;  } public static bool PathContainsInvalidCharacters (строковый путь) {if (path == null) {выбросить новое исключение ArgumentNullException ("путь");  } bool containInvalidCharacters = false;  for (int i = 0; i  (n == 0x7c) || ​​//| (n  (n == 0x7c) || ​​//| (n == 0x3a) ||//: (n == 0x2a) ||//* (n == 0x3f) || //? (n == 0x5c) || ​​// (n == 0x2f) ||///(n  

Я столкнулся с этим, когда столкнулся с аналогичной проблемой, за исключением того, что мне нужно было проверьте, указан ли путь к файлу или папке , если этот файл или папка на самом деле может не существовать . Было несколько комментариев к ответам выше, в которых упоминалось, что они не будут работать для этого сценария. Я нашел решение (я использую VB.NET, но вы можете конвертировать, если вам нужно), которое, кажется, мне подходит:

  Тусклый путь As String = "myFakeFolder  ThisDoesNotExist   "Dim bIsFolder As Boolean = (IO.Path.GetExtension (path) =" ") 'возвращает путь TrueDim как String =" myFakeFolder  ThisDoesNotExist  File.jpg "Dim bIsFolder As Boolean = (IO.Path.GetExtension (path)  = "") 'возвращает False  

Надеюсь, это может быть кому-то полезно!


Я столкнулся с этим, когда столкнулся с аналогичной проблемой, за исключением того, что мне нужно было проверить, указан ли путь к файлу или папке , когда этот файл или папка на самом деле может не существовать . Было несколько комментариев к ответам выше, в которых упоминалось, что они не будут работать для этого сценария. Я нашел решение (я использую VB.NET, но вы можете конвертировать, если вам нужно), которое, кажется, мне подходит:

  Тусклый путь As String = "myFakeFolder  ThisDoesNotExist   "Dim bIsFolder As Boolean = (IO.Path.GetExtension (path) =" ") 'возвращает путь TrueDim как String =" myFakeFolder  ThisDoesNotExist  File.jpg "Dim bIsFolder As Boolean = (IO.Path.GetExtension (path)  = "") 'возвращает False  

Надеюсь, это может быть кому-то полезно!


Оооочень поздно, я знаю, но думал, что все равно поделюсь этим. Если вы работаете исключительно с путями как с строками, выяснить это просто как пирог:

  private bool IsFolder (string ThePath) {string BS = Path.DirectorySeparatorChar.ToString (  );  return Path.GetDirectoryName (ThePath) == ThePath.TrimEnd (BS.ToCharArray ());}  

например: ThePath == "C: SomeFolder File1. txt " в конечном итоге будет таким:

  return" C:  SomeFolder "==" C:  SomeFolder  File1.txt "(FALSE)  

Другой пример: ThePath == "C: SomeFolder " будет таким:

  return "C:  SomeFolder" == "C:  SomeFolder" (TRUE)  

И это также будет работать без обратной косой черты в конце: ThePath == "C: SomeFolder" в конечном итоге будет таким:

  return "C:  SomeFolder" == "C:  SomeFolder" (TRUE)   

Имейте в виду, что это работает только с самими путями, а не с отношениями между путем и «физическим диском» … поэтому он не может сказать вам, путь/файл существует или что-то в этом роде, но он точно может сказать вам, является ли путь папкой или файлом …


soooo в конце игры я знаю, но подумал, что все равно поделюсь этим. Если вы работаете исключительно с путями как с строками, выяснить это просто:

  private bool IsFolder (string ThePath) {string BS = Path.DirectorySeparatorChar.ToString ();  return Path.GetDirectoryName (ThePath) == ThePath.TrimEnd (BS.ToCharArray ());}  

например: ThePath == "C: SomeFolder File1.txt " будет таким:

  return" C:  SomeFolder "==" C:  SomeFolder  File1.txt "(FALSE  )  

Другой пример: ThePath == "C: SomeFolder " в конечном итоге будет таким:

  return "C:  SomeFolder" == "C:  SomeFolder" (TRUE)  

И это также будет работать без обратной косой черты в конце: ThePath == "C: SomeFolder" в конечном итоге будет таким:

  return "C:  SomeFolder" == "C:  SomeFolder"  (ИСТИНА)  

Имейте в виду, что это работает только с самими путями, а не с отношениями между путем и «физическим диском» … поэтому он не может сообщить вам, существует ли путь/файл или что-то в этом роде, но он обязательно может сказать вам, является ли путь папкой или файлом …


Если вы хотите найти каталоги, в том числе те, которые помечены как «скрытые» и «системные», попробуйте следующее (требуется .NET V4):

  FileAttributes fa = File.GetAttributes (path); if (fa.HasFlag  (FileAttributes.Directory))  


Если вы хотите найти каталоги, в том числе те, которые помечены как «скрытые» и «системные», попробуйте следующее (требуется .NET V4):

  FileAttributes fa = File.GetAttributes (path); if (fa.HasFlag (FileAttributes. Directory))  

Мне это нужно, сообщения помогли, теперь все сводится к одному line, и если путь вообще не является путем, он просто возвращается и выходит из метода. Он решает все вышеперечисленные проблемы, также не требует косой черты в конце.

  if (! Directory.Exists (@ "C:  folderName")) return;  


Мне это нужно, сообщения помогли, это сводит его к одной строке, и если путь не является путем в все, он просто возвращается и выходит из метода. Он решает все вышеперечисленные проблемы, также не требует косой черты в конце.

  if (! Directory.Exists (@ "C:  folderName")) return;  

Я использую следующее, оно также проверяет расширение, что означает, что его можно использовать для тестирования если предоставленный путь — это файл, но файл не существует.

  private static bool isDirectory (string path) {bool result = true;  System.IO.FileInfo fileTest = новый System.IO.FileInfo (путь);  если (fileTest.Exists == true) {результат = false;  } else {если (fileTest.Extension! = "") {результат = ложь;  }} возврат результата;}  


Я использую следующее, оно также проверяет расширение, что означает, что его можно использовать для проверки, если предоставленный путь — это файл, но файл, которого не существует.

  private static bool isDirectory (string path) {bool result = true;  System.IO.FileInfo fileTest = новый System.IO.FileInfo (путь);  если (fileTest.Exists == true) {результат = false;  } else {если (fileTest.Extension! = "") {результат = ложь;  }} return result;}  

  с использованием System; с использованием System.  IO; пространство имен FileOrDirectory {class Program {общедоступная статическая строка FileOrDirectory (строковый путь) {if (File.Exists (path)) return "File";  если (Directory.Exists (путь)) вернуть «Каталог»;  return "Путь не существует";  } static void Main () {Console.WriteLine ("Введите путь:");  строка path = Console.ReadLine ();  Console.WriteLine (FileOrDirectory (путь));  }}}  


  using System; using System.IO; пространство имен FileOrDirectory {class Program {общедоступная статическая строка  FileOrDirectory (строковый путь) {if (File.Exists (path)) return "File";  если (Directory.Exists (путь)) вернуть «Каталог»;  return "Путь не существует";  } static void Main () {Console.WriteLine ("Введите путь:");  строка path = Console.ReadLine ();  Консоль. WriteLine (FileOrDirectory (путь));  }}}  

Используя выбранный ответ в этом сообщении, я просмотрел комментарии и Доверьтесь @ ŞafakGür, @Anthony и @Quinn Wilson за их информационные фрагменты, которые привели меня к этому улучшенному ответу, который я написал и протестировал:

 //////Возвращает истину, если путь - каталог, ложь, если это файл, и ноль, если ни один из них или не существует. ////// ///  public static bool?  IsDirFile (этот строковый путь) {bool?  результат = ноль;  if (Directory.Exists (path) || File.Exists (path)) {//получить атрибуты файла для файла или каталога var fileAttr = File.GetAttributes (path);  если (fileAttr.HasFlag (FileAttributes.Directory)) результат = true;  иначе результат = ложь;  } вернуть результат;  }  


Используя выбранный ответ в этом посте, я просмотрел комментарии и дал Доверие @ ŞafakGür, @Anthony и @Quinn Wilson за их информационные биты, которые привели меня к этому улучшенному ответу, который я написал и протестировал:

 //////Возвращает истину, если путь - каталог, ложь, если это файл, и ноль, если ни один из них или не существует. ////// ///  public static bool?  IsDirFile (этот строковый путь) {bool?  результат = ноль;  if (Directory.Exists (path) || File.Exists (path)) {//получить атрибуты файла для файла или каталога var fileAttr = File.GetAttributes (path);  если (fileAttr.HasFlag (FileAttributes.Directory)) результат = true;  иначе результат = ложь;  } вернуть результат;  }  

Возможно для UWP C #

  общедоступная статическая асинхронная задача  AsIStorageItemAsync (эта строка iStorageItemPath) {if (string.IsNullOrEmpty (iStorageItemPath)) return null;  IStorageItem storageItem = ноль;  попробуйте {storageItem = await StorageFolder.GetFolderFromPathAsync (iStorageItemPath);  если (storageItem! = null) вернуть storageItem;  } catch {} попробуйте {storageItem = ожидание StorageFile.GetFileFromPathAsync (iStorageItemPath);  если (storageItem! = null) вернуть storageItem;  } catch {} return storageItem;  }  


Возможно для UWP C #

  общедоступная статическая асинхронная задача  AsIStorageItemAsync (эта строка iStorageItemPath) {if (string.IsNullOrEmpty (iStorageItemPath)) возвращает значение null;  IStorageItem storageItem = ноль;  попробуйте {storageItem = await StorageFolder.GetFolderFromPathAsync (iStorageItemPath);  если (storageItem! = null) вернуть storageItem;  } catch {} попробуйте {storageItem = await StorageFile. GetFileFromPathAsync (iStorageItemPath);  если (storageItem! = null) вернуть storageItem;  } catch {} return storageItem;  }  

Понятно, я на 10 лет опоздал на вечеринку. Я был столкнулся с ситуацией, когда из некоторого свойства я могу получить либо имя файла, либо полный путь к нему. Если путь не указан, я должен проверить наличие файла, добавив «глобальный» путь к каталогу, предоставленный другим свойством.

В моем случае

   var isFileName = System.IO.Path.GetFileName (str) == str;  

сделал свое дело. Хорошо, это не волшебство, но, возможно, это могло бы спасти кому-то несколько минут на выяснение. Поскольку это всего лишь синтаксический анализ строк, поэтому имена директорий с точками могут давать ложные срабатывания …


Понятно, я опоздал на вечеринку на 10 лет. Я столкнулся с ситуацией, когда из какого-то свойства я могу получить либо имя файла, либо полный путь к нему. Если путь не указан, я должен проверить наличие файла, добавив «глобальный» путь к каталогу, предоставленный другим свойством.

В моем случае

   var isFileName = System.IO.Path.GetFileName (str) == str;  

сделал свое дело. Хорошо, это не волшебство, но, возможно, это могло бы спасти кому-то несколько минут на выяснение. Поскольку это просто синтаксический анализ строки, поэтому имена директорий с точками могут давать ложные срабатывания …


Очень поздно на вечеринке, но я обнаружил, что возвращаемое значение Nullable довольно уродливое — IsDirectory (string path ) возврат null не означает несуществующий путь без подробных комментариев, поэтому я придумал следующее:

  public static class PathHelper {//////Определяет, относится ли данный путь к существующему файлу или каталогу на диске. ////// Путь для тестирования. /// Когда этот метод возвращает значение, содержит true, если путь был найден  быть существующим каталогом, false во всех других сценариях. /// true, если путь существует;  в противном случае - false. /// Если  имеет значение null. /// Если  равно   public static bool PathExists (string path, out bool isDirectory) {if (path == null) throw new ArgumentNullException (nameof (path  ));  if (path == string.Empty) throw new ArgumentException («Значение не может быть пустым.», nameof (путь));  isDirectory = Directory.Exists (путь);  return isDirectory ||  файл. Существует (путь);  }}  

Этот вспомогательный метод написан так, чтобы быть подробным и достаточно кратким, чтобы понять намерение при первом чтении.

 //////Пример использования /// public static void Usage () {const string path = @ "C:   dev ";  если (! PathHelper.PathExists (путь, выход var isDirectory)) return;  if (isDirectory) {//Сделайте что-нибудь с вашим каталогом} else {//Сделайте что-нибудь с вашим файлом}}  


Очень опоздал на вечеринку, но я обнаружил, что возвращаемое значение Nullable довольно уродливое — IsDirectory (путь к строке) , возвращающий null не означает несуществующий путь без подробных комментариев, поэтому я придумал следующее:

  общедоступный статический класс PathHelper {//////Определяет, относится ли данный путь к существующему файлу или каталогу на диске. ////// Путь для тестирования. /// Когда этот метод возвращает значение, содержит true, если путь был найден  быть существующим каталогом, false во всех других сценариях. /// true, если путь существует;  в противном случае - false. /// Если  имеет значение null. /// Если  равно   public static bool PathExists (string path, out bool isDirectory) {if (path == null) throw new ArgumentNullException (nameof (path  ));  if (path == string.Empty) throw new ArgumentException («Значение не может быть пустым.», nameof (путь));  isDirectory = Directory.Exists (путь);  return isDirectory ||  File.Exists (путь);  }}  

Этот вспомогательный метод написан так, чтобы быть подробным и достаточно кратким, чтобы понять намерение при первом чтении.

 //////Пример использования /// public static void Usage () {const string path = @ "C:   dev ";  если (! PathHelper.PathExists (путь, выход var isDirectory)) return;  if (isDirectory) {//Сделайте что-нибудь с вашим каталогом} else {//Сделайте что-нибудь с вашим файлом}}  

Просто добавляем дополнительный регистр — «Выбор папки». в пути

В моем приложении я получаю недавно открытые пути, переданные мне, некоторые из которых имеют «Выбор папки». в конце.

Некоторые FileOpenDialogs и WinMerge добавляют «Выбор папки». в пути (это правда).

Но под ОС Windows «Выбор папки. «не рекомендованное имя файла или папки (например, никогда не делайте этого — трясет кулаком ). Как сказано здесь: http://msdn.microsoft.com/en-us /library/aa365247%28VS.85%29.aspx

Не заканчивайте имя файла или каталога пробелом или точкой. Хотя базовая файловая система может поддерживать такие имена оболочка Windows и пользовательский интерфейс — нет. Однако можно указать точку в качестве первого символа имени. Например, «.temp».

Итак, пока «Выбор папки» не следует использовать, это может быть. (Круто).

Достаточно объяснений — мои код (мне очень нравятся перечисления):

  Утилита общедоступного статического класса {общедоступное перечисление ePathType {ePathType_Unknown = 0, ePathType_ExistingFile = 1, ePathType_ExistingFolder = 2, ePathType_ExistingFolder = 3, public_ExistingFolder_Folder =  static ePathType GetPathType (строковый путь) {if (File.Exists (path) == true) {return ePathType.ePathType_ExistingFile;} if (Directory.Exists (path) == tr  ue) {return ePathType.ePathType_ExistingFolder;  } if (path.EndsWith ("Folder Selection.") == true) {//Проверить путь еще раз без «Выбор папки».  path = path.Replace ("\ Выбор папки.", "");  if (Directory.Exists (path) == true) {//Может вернуть ePathType_ExistingFolder, но предпочитает, чтобы вызывающая сторона знала, что в их пути есть текст, который нужно удалить ... return ePathType.ePathType_ExistingFolder_FolderSelectionAdded;  }} return ePathType.ePathType_Unknown;  }}  


Просто добавляем дополнительный регистр — «Выбор папки». в пути

В моем приложении я получаю недавно открытые пути, переданные мне, некоторые из которых имеют «Выбор папки». в конце.

Некоторые FileOpenDialogs и WinMerge добавляют «Выбор папки». в пути (это правда).

Но под ОС Windows «Выбор папки». не рекомендуется использовать имя файла или папки (например, никогда не делайте этого — трясет кулаком ). Как сказано здесь: http://msdn.microsoft.com/en-us/ library/aa365247% 28VS.85% 29.aspx

Не заканчивайте имя файла или каталога пробелом или точкой. Хотя базовая файловая система может поддерживать такие имена, оболочка Windows и пользовательский интерфейс — нет. Однако допустимо указывать точку в качестве первого символа имени. Например, «.temp».

Так что пока «Выбор папки». не следует использовать, можно. (круто).

Достаточно объяснений — мой код (мне очень нравятся перечисления):

  public static class Utility {public enum ePathType {ePathType_Unknown  = 0, ePathType_ExistingFile = 1, ePathType_ExistingFolder = 2, ePathType_ExistingFolder_FolderSelectionAdded = 3,} общедоступный статический ePathType GetPathType (строковый путь) {if (File.Exists (path) == true) {return ePathType. ePathType_ExistingFile;  } если (Directory.Exists (путь) == true) {return ePathType.ePathType_ExistingFolder;  } if (path.EndsWith ("Folder Selection.") == true) {//Проверить путь еще раз без «Выбор папки».  path = path.Replace ("\ Выбор папки.", "");  if (Directory.Exists (path) == true) {//Может вернуть ePathType_ExistingFolder, но предпочитает, чтобы вызывающая сторона знала, что в их пути есть текст, который нужно удалить ... return ePathType.ePathType_ExistingFolder_FolderSelectionAdded;  }} return ePathType.ePathType_Unknown;  }}  

Оцените статью
techsly.ru
Добавить комментарий