Кращий спосіб перевірити, чи Path - це файл чи каталог?


382

Я обробляю 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 для вирішення цього питання, але мені не вдалося це зробити. Чи існує такий метод, і якщо ні, то який найпростіший спосіб визначити, чи шлях - це файл чи каталог?


8
Чи може хтось змінити назву питання, щоб вказати "існуючий" файл / каталог? Усі відповіді стосуються шляху до файлу / каталогу, який знаходиться на диску.
Джейк Бергер

1
@jberger, будь ласка, зверніться до моєї відповіді нижче. Я знайшов спосіб досягти цього для шляхів файлів / папок, які можуть бути або не існувати.
lhan


Як ви заселяєте цей вид дерева? Як ви отримуєте шлях із нього?
Випадково832

Відповіді:


594

Від Як сказати , якщо шлях до файлу або каталогу :

// get the file attributes for file or directory
FileAttributes attr = File.GetAttributes(@"c:\Temp");

//detect whether its a directory or file
if ((attr & FileAttributes.Directory) == FileAttributes.Directory)
    MessageBox.Show("Its a directory");
else
    MessageBox.Show("Its a file");

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

Згідно з коментарями нижче, якщо ви користуєтесь .NET 4.0 або пізнішої версії (а максимальна продуктивність не є критичною), ви можете написати код більш чистим способом:

// get the file attributes for file or directory
FileAttributes attr = File.GetAttributes(@"c:\Temp");

if (attr.HasFlag(FileAttributes.Directory))
    MessageBox.Show("Its a directory");
else
    MessageBox.Show("Its a file");

8
+1 Це кращий підхід і значно швидший, ніж запропоноване мною рішення.
Ендрю Заєць

6
@ KeyMs92 Її розрядна математика. В основному, attr - деяке бінарне значення, яке має один біт, що означає "це каталог". Побітовий і &оператор поверне двійкове значення, де включені лише біти, які є в (1) в обох операндах. У цьому випадку, виконуючи побіт і поступаючи проти, attrі FileAttributes.Directoryзначення поверне значення, FileAttributes.Directoryякщо ввімкнено біт атрибута файлу каталогу. Дивіться en.wikipedia.org/wiki/Bitwise_operation для кращого пояснення.
Кайл Трауберман

6
@jberger Якщо шлях не існує, це неоднозначно, чи C:\Tempстосується до себе виклику каталогу Tempабо файла, який називається Temp. Що код мав робити?
ta.speot.is

26
@Key: Після .NET 4.0 attr.HasFlag(FileAttributes.Directory)замість цього можна використовувати.
Şafak Gür

13
@ ŞafakGür: Не робіть цього в певному часовому циклі. attr.HasFlag () повільний, як пекло, і використовує Reflection для кожного дзвінка
springy76

247

Як щодо їх використання?

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

43
Це також має перевагу в тому, що не кидати виняток на недійсний шлях, на відміну від File.GetAttributes().
Діана

Я використовую бібліотеку "Довгий шлях" від BCL bcl.codeplex.com/… у своєму проекті, тому немає можливості отримати атрибути файлів, але виклик Exist - хороший спосіб вирішення.
Путердо Борато

4
@jberger Я б очікував, що він НЕ працює для шляхів до неіснуючих файлів / папок. File.Exists ("c: \\ temp \\ nonexistant.txt") повинен повертати помилковий, як це робиться.
michaelkoss

12
Якщо ви турбуєтесь про неіснуючі файли / папки, спробуйте це 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 }
Дастін Таунсенд,

1
Більш докладно про це перебувають на msdn.microsoft.com/en-us/library / ...
Moji

20

За допомогою цього рядка ви можете отримати, якщо шлях - це каталог або файл:

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

4
Майте на увазі, що для цього вам потрібно принаймні .NET 4.0. Також це вибухне, якщо шлях не є дійсним.
nawfal

Використовуйте об’єкт FileInfo, щоб перевірити, чи існує шлях: FileInfo pFinfo = новий FileInfo (FList [0]); if (pFinfo.Exists) {if (File.GetAttributes (FList [0]). HasFlag (FileAttributes.Directory)) {}}. Цей працює для мене.
Майкл Стимсон

Якщо ви вже створили об’єкт FileInfo і використовуєте властивість екземпляра екземпляра, чому б не отримати доступ до його властивості Attributes замість статичного методу File.GetAttributes ()?
dynamhael

10

Ось моя:

    bool IsPathDirectory(string path)
    {
        if (path == null) throw new ArgumentNullException("path");
        path = path.Trim();

        if (Directory.Exists(path)) 
            return true;

        if (File.Exists(path)) 
            return false;

        // neither file nor directory exists. guess intention

        // if has trailing slash then it's a directory
        if (new[] {"\\", "/"}.Any(x => path.EndsWith(x)))
            return true; // ends with slash

        // if has extension then its a file; directory otherwise
        return string.IsNullOrWhiteSpace(Path.GetExtension(path));
    }

Це схоже на відповіді інших, але не зовсім те саме.


3
Технічно слід використовувати Path.DirectorySeparatorCharіPath.AltDirectorySeparatorChar
drzaus

1
Ця ідея здогадуватися про намір цікава. ІМХО краще розділити на два методи. Спосіб перший робить тести існування, повертаючи нульовий булевий. Якщо абонент бажає частину "здогадуватися" за результатом null від One, тоді зателефонуйте до методу другого, який робить здогад.
ToolmakerSteve

2
Я б переписав це, щоб повернути кортеж із тим, здогадався він чи ні.
Ронні Овербі

1
"якщо має розширення, то його файл" - це неправда. Файл не повинен мати розширення (навіть у Windows), а каталог може мати "розширення". Наприклад, це може бути файл або каталог: "C: \ New folder.log"
bytedev

2
@bytedev Я знаю це, але в цей момент у функції код здогадується про наміри. Існує навіть коментар, який говорить про це. Більшість файлів мають розширення. Більшість каталогів цього не роблять.
Ронні Овербі

7

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

private static bool IsDirectory(string path)
{
    System.IO.FileAttributes fa = System.IO.File.GetAttributes(path);
    return (fa & FileAttributes.Directory) != 0;
}

Ви також можете розглянути можливість додавання об'єкта до властивості тегу елемента керування TreeView під час заповнення елемента керування, що містить додаткові метадані для елемента. Наприклад, ви можете додати об’єкт FileInfo для файлів та об’єкт DirectoryInfo для каталогів, а потім протестувати тип елемента у властивості тегу, щоб зберегти здійснення додаткових системних викликів для отримання цих даних при натисканні на елемент.


2
чим це відрізняється від іншої відповіді
Джейк Бергер

6
Замість цього жахливого блоку логіки спробуйтеisDirectory = (fa & FileAttributes.Directory) != 0);
Безсмертний Блакитний

5

Це було найкраще, що я міг придумати, враховуючи поведінку властивостей Exists and Attributes:

using System.IO;

public static class FileSystemInfoExtensions
{
    /// <summary>
    /// Checks whether a FileInfo or DirectoryInfo object is a directory, or intended to be a directory.
    /// </summary>
    /// <param name="fileSystemInfo"></param>
    /// <returns></returns>
    public static bool IsDirectory(this FileSystemInfo fileSystemInfo)
    {
        if (fileSystemInfo == null)
        {
            return false;
        }

        if ((int)fileSystemInfo.Attributes != -1)
        {
            // if attributes are initialized check the directory flag
            return fileSystemInfo.Attributes.HasFlag(FileAttributes.Directory);
        }

        // If we get here the file probably doesn't exist yet.  The best we can do is 
        // try to judge intent.  Because directories can have extensions and files
        // can lack them, we can't rely on filename.
        // 
        // We can reasonably assume that if the path doesn't exist yet and 
        // FileSystemInfo is a DirectoryInfo, a directory is intended.  FileInfo can 
        // make a directory, but it would be a bizarre code path.

        return fileSystemInfo is DirectoryInfo;
    }
}

Ось як це тестується:

    [TestMethod]
    public void IsDirectoryTest()
    {
        // non-existing file, FileAttributes not conclusive, rely on type of FileSystemInfo
        const string nonExistentFile = @"C:\TotallyFakeFile.exe";

        var nonExistentFileDirectoryInfo = new DirectoryInfo(nonExistentFile);
        Assert.IsTrue(nonExistentFileDirectoryInfo.IsDirectory());

        var nonExistentFileFileInfo = new FileInfo(nonExistentFile);
        Assert.IsFalse(nonExistentFileFileInfo.IsDirectory());

        // non-existing directory, FileAttributes not conclusive, rely on type of FileSystemInfo
        const string nonExistentDirectory = @"C:\FakeDirectory";

        var nonExistentDirectoryInfo = new DirectoryInfo(nonExistentDirectory);
        Assert.IsTrue(nonExistentDirectoryInfo.IsDirectory());

        var nonExistentFileInfo = new FileInfo(nonExistentDirectory);
        Assert.IsFalse(nonExistentFileInfo.IsDirectory());

        // Existing, rely on FileAttributes
        const string existingDirectory = @"C:\Windows";

        var existingDirectoryInfo = new DirectoryInfo(existingDirectory);
        Assert.IsTrue(existingDirectoryInfo.IsDirectory());

        var existingDirectoryFileInfo = new FileInfo(existingDirectory);
        Assert.IsTrue(existingDirectoryFileInfo.IsDirectory());

        // Existing, rely on FileAttributes
        const string existingFile = @"C:\Windows\notepad.exe";

        var existingFileDirectoryInfo = new DirectoryInfo(existingFile);
        Assert.IsFalse(existingFileDirectoryInfo.IsDirectory());

        var existingFileFileInfo = new FileInfo(existingFile);
        Assert.IsFalse(existingFileFileInfo.IsDirectory());
    }

5

Поєднавши пропозиції з інших відповідей, я зрозумів, що придумав приблизно те саме, що і у відповіді Ронні Овербі . Ось кілька тестів, щоб вказати на деякі речі, над якими слід задуматися:

  1. папки можуть мати "розширення": C:\Temp\folder_with.dot
  2. файли не можуть закінчуватися роздільником каталогів (косою рисою)
  3. Технічно є два роздільники каталогів, які залежать від платформи - тобто можуть бути, а можуть і не бути косою рисою ( Path.DirectorySeparatorCharі Path.AltDirectorySeparatorChar)

Тести (Linqpad)

var paths = new[] {
    // exists
    @"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",
    // doesn't exist
    @"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_file_thats_not_a_dir",
    @"C:\Temp\dir_test\dne_notadir.txt",        
};

foreach(var path in paths) {
    IsFolder(path/*, false*/).Dump(path);
}

Результати

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
  True 
C:\Temp\dir_test\file_thats_not_a_dir
  False 
C:\Temp\dir_test\notadir.txt
  False 
C:\Temp\dir_test\dne_folder_is_a_dir
  True 
C:\Temp\dir_test\dne_folder_trailing_slash\
  True 
C:\Temp\dir_test\non_existing_folder_with.ext
  False (this is the weird one)
C:\Temp\dir_test\dne_file_thats_not_a_dir
  True 
C:\Temp\dir_test\dne_notadir.txt
  False 

Метод

/// <summary>
/// Whether the <paramref name="path"/> is a folder (existing or not); 
/// optionally assume that if it doesn't "look like" a file then it's a directory.
/// </summary>
/// <param name="path">Path to check</param>
/// <param name="assumeDneLookAlike">If the <paramref name="path"/> doesn't exist, does it at least look like a directory name?  As in, it doesn't look like a file.</param>
/// <returns><c>True</c> if a folder/directory, <c>false</c> if not.</returns>
public static bool IsFolder(string path, bool assumeDneLookAlike = true)
{
    // /programming/1395205/better-way-to-check-if-path-is-a-file-or-a-directory
    // turns out to be about the same as https://stackoverflow.com/a/19596821/1037948

    // check in order of verisimilitude

    // exists or ends with a directory separator -- files cannot end with directory separator, right?
    if (Directory.Exists(path)
        // use system values rather than assume slashes
        || path.EndsWith("" + Path.DirectorySeparatorChar)
        || path.EndsWith("" + Path.AltDirectorySeparatorChar))
        return true;

    // if we know for sure that it's an actual file...
    if (File.Exists(path))
        return false;

    // if it has an extension it should be a file, so vice versa
    // although technically directories can have extensions...
    if (!Path.HasExtension(path) && assumeDneLookAlike)
        return true;

    // only works for existing files, kinda redundant with `.Exists` above
    //if( File.GetAttributes(path).HasFlag(FileAttributes.Directory) ) ...; 

    // no idea -- could return an 'indeterminate' value (nullable bool)
    // or assume that if we don't know then it's not a folder
    return false;
}

Path.DirectorySeparatorChar.ToString()замість рядка concat з ""?
Пройшов кодування

@GoneCoding, ймовірно; в той час я працював з купою зведених властивостей, тому я звик "конкоматитись із порожньою рядком", а не перейматися перевіренням на нуль. Ви також можете зробити new String(Path.DirectorySeparatorChar, 1)так, як це ToStringробиться, якби хотіли реально оптимізуватися.
drzaus

4

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

[DllImport(SHLWAPI, CharSet = CharSet.Unicode)]
[return: MarshalAsAttribute(UnmanagedType.Bool)]
[ResourceExposure(ResourceScope.None)]
internal static extern bool PathIsDirectory([MarshalAsAttribute(UnmanagedType.LPWStr), In] string pszPath);

Тоді ви б назвали це так:

#region IsDirectory
/// <summary>
/// Verifies that a path is a valid directory.
/// </summary>
/// <param name="path">The path to verify.</param>
/// <returns><see langword="true"/> if the path is a valid directory; 
/// otherwise, <see langword="false"/>.</returns>
/// <exception cref="T:System.ArgumentNullException">
/// <para><paramref name="path"/> is <see langword="null"/>.</para>
/// </exception>
/// <exception cref="T:System.ArgumentException">
/// <para><paramref name="path"/> is <see cref="F:System.String.Empty">String.Empty</see>.</para>
/// </exception>
public static bool IsDirectory(string path)
{
    return PathIsDirectory(path);
}

31
Некрасивий. Я ненавиджу інтероп робити ці прості завдання. І це не портативно. і це некрасиво. Я сказав, що це некрасиво? :)
Ігнасіо Солер Гарсія

5
@SoMoS На ваш погляд, це може бути "потворно", але це все-таки найбільш точний підхід. Так, це не портативне рішення, але це питання не було.
Скотт Дорман

8
Що ви точно маєте на увазі? Це дає ті ж результати, що і відповідь Квін Вілсон та необхідний інтероп, який порушує портативність. Для мене це так само точно, як і інші рішення та мають побічні ефекти, яких інші не роблять.
Ігнасіо Солер Гарсія

7
Для цього є Framework API. Використання Interop - це не шлях.
TomXP411

5
Так, це працює, але це НЕ "найточніше" рішення - не більше ніж використання існуючої .NET Framework. Натомість ви берете 6 рядків коду, щоб замінити те, що можна зробити в одному рядку .NET Framework, і замикаєтесь лише на використанні Windows, на відміну від того, щоб залишати відкритим можливість переносити це за допомогою Mono Project. Ніколи не використовуйте Interop, коли .NET Framework пропонує більш елегантне рішення.
Русь

2

Ось що ми використовуємо:

using System;

using System.IO;

namespace crmachine.CommonClasses
{

  public static class CRMPath
  {

    public static bool IsDirectory(string path)
    {
      if (path == null)
      {
        throw new ArgumentNullException("path");
      }

      string reason;
      if (!IsValidPathString(path, out reason))
      {
        throw new ArgumentException(reason);
      }

      if (!(Directory.Exists(path) || File.Exists(path)))
      {
        throw new InvalidOperationException(string.Format("Could not find a part of the path '{0}'",path));
      }

      return (new System.IO.FileInfo(path).Attributes & FileAttributes.Directory) == FileAttributes.Directory;
    } 

    public static bool IsValidPathString(string pathStringToTest, out string reasonForError)
    {
      reasonForError = "";
      if (string.IsNullOrWhiteSpace(pathStringToTest))
      {
        reasonForError = "Path is Null or Whitespace.";
        return false;
      }
      if (pathStringToTest.Length > CRMConst.MAXPATH) // MAXPATH == 260
      {
        reasonForError = "Length of path exceeds MAXPATH.";
        return false;
      }
      if (PathContainsInvalidCharacters(pathStringToTest))
      {
        reasonForError = "Path contains invalid path characters.";
        return false;
      }
      if (pathStringToTest == ":")
      {
        reasonForError = "Path consists of only a volume designator.";
        return false;
      }
      if (pathStringToTest[0] == ':')
      {
        reasonForError = "Path begins with a volume designator.";
        return false;
      }

      if (pathStringToTest.Contains(":") && pathStringToTest.IndexOf(':') != 1)
      {
        reasonForError = "Path contains a volume designator that is not part of a drive label.";
        return false;
      }
      return true;
    }

    public static bool PathContainsInvalidCharacters(string path)
    {
      if (path == null)
      {
        throw new ArgumentNullException("path");
      }

      bool containedInvalidCharacters = false;

      for (int i = 0; i < path.Length; i++)
      {
        int n = path[i];
        if (
            (n == 0x22) || // "
            (n == 0x3c) || // <
            (n == 0x3e) || // >
            (n == 0x7c) || // |
            (n  < 0x20)    // the control characters
          )
        {
          containedInvalidCharacters = true;
        }
      }

      return containedInvalidCharacters;
    }


    public static bool FilenameContainsInvalidCharacters(string filename)
    {
      if (filename == null)
      {
        throw new ArgumentNullException("filename");
      }

      bool containedInvalidCharacters = false;

      for (int i = 0; i < filename.Length; i++)
      {
        int n = filename[i];
        if (
            (n == 0x22) || // "
            (n == 0x3c) || // <
            (n == 0x3e) || // >
            (n == 0x7c) || // |
            (n == 0x3a) || // : 
            (n == 0x2a) || // * 
            (n == 0x3f) || // ? 
            (n == 0x5c) || // \ 
            (n == 0x2f) || // /
            (n  < 0x20)    // the control characters
          )
        {
          containedInvalidCharacters = true;
        }
      }

      return containedInvalidCharacters;
    }

  }

}

2

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

Dim path As String = "myFakeFolder\ThisDoesNotExist\"
Dim bIsFolder As Boolean = (IO.Path.GetExtension(path) = "")
'returns True

Dim path As String = "myFakeFolder\ThisDoesNotExist\File.jpg"
Dim bIsFolder As Boolean = (IO.Path.GetExtension(path) = "")
'returns False

Сподіваємось, це може бути корисним комусь!


1
ви спробували метод Path.HasExtension ?
Джейк Бергер

Якщо його не існує, то це не файл чи каталог. Будь-яке ім'я можна створити як будь-яке. Якщо ви маєте намір створити його, то ви повинні знати, що ви створюєте, а якщо цього не робите, то навіщо вам, можливо, потрібна ця інформація?
Випадково832

8
Папка може бути названа test.txtі файл може бути названий test- в цих випадках код буде повертати невірні результати
Стефан Бауер

2
Існує метод .Exists в класах System.IO.FIle і System.IO.Directory. це справа. Каталоги можуть мати розширення; Я бачу це часто.
TomXP411

2

так що пізно в грі я знаю, але думав, що все одно поділюсь цим. Якщо ви працюєте виключно з контурами в якості рядків, розібратися в цьому легко як пиріг:

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)

Тут майте на увазі, що це працює лише з самими шляхами, а не з взаємозв'язком між контуром та "фізичним диском" ... тому він не може сказати вам, чи існує шлях / файл чи щось подібне, але це точно може сказати вам, чи шлях - це папка чи файл ...


2
Не працює з System.IO.FileSystemWatcherтих пір, коли каталог видалено, він надсилає c:\my_directoryяк аргумент, який є тим самим, коли c:\my_directoryвидалено файл, що не містить файлу з розширенням .
Рей Ченг

GetDirectoryName('C:\SomeFolder')повертається 'C:\', тому ваш останній випадок не працює. Це не розрізняє каталоги та файли без розширень.
Люсі

Ви помилково припускаєте, що шлях до каталогу завжди буде включати остаточний "\". Наприклад, Path.GetDirectoryName("C:\SomeFolder\SomeSubFolder")повернеться C:\SomeFolder. Зауважте, що ваші власні приклади повернення GetDirectoryName показують, що він повертає шлях, який не закінчується на зворотному куті. Це означає, що якщо хтось використовує GetDirectoryName в іншому місці, щоб отримати шлях до каталогу, а потім подає його у ваш метод, він отримає неправильну відповідь.
ToolmakerSteve

1

Якщо ви хочете знайти каталоги, включаючи ті, що позначені "приховано" та "система", спробуйте це (потрібно .NET V4):

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

1

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

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

0

Я використовую наступне, він також тестує розширення, що означає, що його можна використовувати для тестування, якщо введений шлях - це файл, але файл не існує.

private static bool isDirectory(string path)
{
    bool result = true;
    System.IO.FileInfo fileTest = new System.IO.FileInfo(path);
    if (fileTest.Exists == true)
    {
        result = false;
    }
    else
    {
        if (fileTest.Extension != "")
        {
            result = false;
        }
    }
    return result;
}

1
Розширення FileInfo - це (IMAO) - хороший варіант перевірити неіснуючі шляхи
dataCore

2
ваша друга умова (інше) смердюча. якщо це не існуючий файл, то ви не знаєте, що це може бути (каталоги також можуть закінчуватися чимось на зразок ".txt").
nawfal

0
using System;
using System.IO;
namespace FileOrDirectory
{
     class Program
     {
          public static string FileOrDirectory(string path)
          {
               if (File.Exists(path))
                    return "File";
               if (Directory.Exists(path))
                    return "Directory";
               return "Path Not Exists";
          }
          static void Main()
          {
               Console.WriteLine("Enter The Path:");
               string path = Console.ReadLine();
               Console.WriteLine(FileOrDirectory(path));
          }
     }
}

0

Використовуючи вибрану відповідь у цій публікації, я переглянув коментарі та надав довіру @ ŞafakGür, @Anthony та @Quinn Wilson за їх інформаційні біти, які привели мене до цієї вдосконаленої відповіді, яку я написав і перевірив:

    /// <summary>
    /// Returns true if the path is a dir, false if it's a file and null if it's neither or doesn't exist.
    /// </summary>
    /// <param name="path"></param>
    /// <returns></returns>
    public static bool? IsDirFile(this string path)
    {
        bool? result = null;

        if(Directory.Exists(path) || File.Exists(path))
        {
            // get the file attributes for file or directory
            var fileAttr = File.GetAttributes(path);

            if (fileAttr.HasFlag(FileAttributes.Directory))
                result = true;
            else
                result = false;
        }

        return result;
    }

Здається, трохи марно шукати атрибути після перевірки на наявність каталогу / файлів ()? Ці два дзвінки поодинці виконують всю необхідну роботу тут.
Пройшов кодування

0

Можливо для UWP C #

public static async Task<IStorageItem> AsIStorageItemAsync(this string iStorageItemPath)
    {
        if (string.IsNullOrEmpty(iStorageItemPath)) return null;
        IStorageItem storageItem = null;
        try
        {
            storageItem = await StorageFolder.GetFolderFromPathAsync(iStorageItemPath);
            if (storageItem != null) return storageItem;
        } catch { }
        try
        {
            storageItem = await StorageFile.GetFileFromPathAsync(iStorageItemPath);
            if (storageItem != null) return storageItem;
        } catch { }
        return storageItem;
    }

0

Я бачу, я запізнююсь на вечірку на 10 років. Я стикався з ситуацією, коли з якогось властивості я можу отримати або ім’я файлу, або повний шлях до файлу. Якщо шлях не передбачений, я повинен перевірити наявність файлу, додавши "глобальний" каталог-шлях, наданий іншим властивістю.

У моєму випадку

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

зробив трюк. Гаразд, це не магія, але, можливо, це могло б заощадити когось на кілька хвилин розібратися. Оскільки це лише синтаксичний розбір рядків, то Dir-імена з крапками можуть давати помилкові позитиви ...


0

Дуже пізно на вечірку тут, але я виявив, що Nullable<Boolean>значення повернення є досить потворним - IsDirectory(string path)повернення nullне прирівнюється до неіснуючого шляху без багатослівного коментування, тому я придумав таке:

public static class PathHelper
{
    /// <summary>
    /// Determines whether the given path refers to an existing file or directory on disk.
    /// </summary>
    /// <param name="path">The path to test.</param>
    /// <param name="isDirectory">When this method returns, contains true if the path was found to be an existing directory, false in all other scenarios.</param>
    /// <returns>true if the path exists; otherwise, false.</returns>
    /// <exception cref="ArgumentNullException">If <paramref name="path"/> is null.</exception>
    /// <exception cref="ArgumentException">If <paramref name="path"/> equals <see cref="string.Empty"/></exception>
    public static bool PathExists(string path, out bool isDirectory)
    {
        if (path == null) throw new ArgumentNullException(nameof(path));
        if (path == string.Empty) throw new ArgumentException("Value cannot be empty.", nameof(path));

        isDirectory = Directory.Exists(path);

        return isDirectory || File.Exists(path);
    }
}

Цей хелперний метод написаний досить багатослівним та стислим, щоб зрозуміти намір у перший раз, коли ви його прочитали.

/// <summary>
/// Example usage of <see cref="PathExists(string, out bool)"/>
/// </summary>
public static void Usage()
{
    const string path = @"C:\dev";

    if (!PathHelper.PathExists(path, out var isDirectory))
        return;

    if (isDirectory)
    {
        // Do something with your directory
    }
    else
    {
        // Do something with your file
    }
}

-4

Не вдалось би це зробити?

var isFile = Regex.IsMatch(path, @"\w{1,}\.\w{1,}$");

1
Це не працюватиме лише тому, що в іменах папок можуть бути періоди
KSib

Також у файлах не повинно бути періодів.
Кіт Пінсон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.