Cara yang lebih baik untuk memeriksa apakah Path adalah File atau Direktori?

383

Saya sedang memproses TreeViewdirektori dan file. Seorang pengguna dapat memilih file atau direktori dan kemudian melakukan sesuatu dengannya. Ini mengharuskan saya untuk memiliki metode yang melakukan tindakan berbeda berdasarkan pilihan pengguna.

Saat ini saya sedang melakukan sesuatu seperti ini untuk menentukan apakah path adalah file atau direktori:

bool bIsFile = false;
bool bIsDirectory = false;

try
{
    string[] subfolders = Directory.GetDirectories(strFilePath);

    bIsDirectory = true;
    bIsFile = false;
}
catch(System.IO.IOException)
{
    bIsFolder = false;
    bIsFile = true;
}

Saya tidak dapat menahan perasaan bahwa ada cara yang lebih baik untuk melakukan ini! Saya berharap untuk menemukan metode .NET standar untuk menangani ini, tetapi saya belum dapat melakukannya. Apakah ada metode seperti itu, dan jika tidak, apa cara yang paling mudah untuk menentukan apakah path adalah file atau direktori?

SnAzBaZ
sumber
8
Dapatkah seseorang mengedit judul pertanyaan untuk menentukan file / direktori "yang ada" ? Semua jawaban berlaku untuk jalur untuk file / direktori yang ada di disk.
Jake Berger
1
@ jberger silakan lihat jawaban saya di bawah ini. Saya menemukan cara untuk mencapai ini untuk jalur file / folder yang mungkin ada atau tidak ada.
lhan
Bagaimana Anda mengisi tampilan pohon ini? Bagaimana Anda mendapatkan jalan keluar darinya?
Random832

Jawaban:

596

Dari Bagaimana cara mengetahui apakah path adalah file atau direktori :

// 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");

Pembaruan untuk .NET 4.0+

Per komentar di bawah ini, jika Anda menggunakan .NET 4.0 atau yang lebih baru (dan kinerja maksimum tidak kritis) Anda dapat menulis kode dengan cara yang lebih bersih:

// 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");
Quinn Wilson
sumber
8
+1 Ini adalah pendekatan yang lebih baik dan secara signifikan lebih cepat daripada solusi yang saya usulkan.
Andrew Hare
6
@ KeyMs92 Matematika bitwise-nya. Pada dasarnya, attr adalah beberapa nilai biner dengan satu bit yang berarti "ini adalah direktori". Bitwise dan &operator akan mengembalikan nilai biner di mana hanya bit yang aktif (1) di kedua operan dihidupkan. Dalam hal ini melakukan bitwise dan operasi terhadap attrdan FileAttributes.Directorynilai akan mengembalikan nilai FileAttributes.Directoryjika bit atribut file direktori dihidupkan. Lihat en.wikipedia.org/wiki/Bitwise_operation untuk penjelasan yang lebih baik.
Kyle Trauberman
6
@ jberger Jika path tidak ada maka ambigu apakah C:\Tempmerujuk ke direktori yang disebut Tempatau file yang dipanggil Temp. Apa yang dimaksudkan dengan kode itu?
ta.speot.is
26
@ Kunci: Setelah. NET 4.0, attr.HasFlag(FileAttributes.Directory)bisa digunakan sebagai gantinya.
Şafak Gür
13
@ ŞafakGür: Jangan lakukan ini di dalam lingkaran sensitif waktu. attr.HasFlag () lambat sekali dan menggunakan Refleksi untuk setiap panggilan
springy76
247

Bagaimana kalau menggunakan ini?

File.Exists();
Directory.Exists();
llamaoo7
sumber
43
Ini juga memiliki keuntungan tidak melemparkan pengecualian pada jalur yang tidak valid, tidak seperti File.GetAttributes().
Deanna
Saya menggunakan Long Path library dari BCL bcl.codeplex.com/... dalam proyek saya sehingga tidak ada cara untuk mendapatkan atribut file tetapi memanggil Exist adalah solusi yang bagus.
Puterdo Borato
4
@ jberger Saya berharap itu TIDAK bekerja untuk path ke file / folder tidak ada. File.Exists ("c: \\ temp \\ nonexistant.txt") harus mengembalikan false, seperti halnya.
michaelkoss
12
Jika Anda khawatir tentang file / folder yang tidak ada coba ini 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 }
Dustin Townsend
1
Rincian lebih lanjut tentang ini ada di msdn.microsoft.com/en-us/library/…
Moji
20

Dengan hanya baris ini yang bisa Anda dapatkan jika path adalah direktori atau file:

File.GetAttributes(data.Path).HasFlag(FileAttributes.Directory)
Kanal Gerard Gilabert
sumber
4
Pikiran Anda memerlukan setidaknya. NET 4.0 untuk ini. Ini juga akan meledak jika jalur bukan jalur yang valid.
nawfal
Gunakan objek FileInfo untuk memeriksa apakah path ada: FileInfo pFinfo = new FileInfo (FList [0]); if (pFinfo.Exists) {if (File.GetAttributes (FList [0]). HasFlag (FileAttributes.Directory)) {}}. Yang ini bekerja untuk saya.
Michael Stimson
Jika Anda telah membuat objek FileInfo dan menggunakan properti Exists dari instance, mengapa tidak mengakses properti Attributesnya alih-alih menggunakan metode File.GetAttributes () yang statis?
dynamichael
10

Ini milik saya:

    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));
    }

Ini mirip dengan jawaban orang lain tetapi tidak persis sama.

Ronnie Overby
sumber
3
Secara teknis, Anda harus menggunakan Path.DirectorySeparatorChardanPath.AltDirectorySeparatorChar
drzaus
1
Gagasan untuk menebak maksud ini menarik. IMHO lebih baik dibagi menjadi dua metode. Metode Satu melakukan tes Keberadaan, mengembalikan boolean yang dapat dibatalkan. Jika penelepon menginginkan bagian "tebak", pada hasil nol dari One, maka panggil Metode Dua, yang melakukan tebakan.
ToolmakerSteve
2
Saya akan menulis ulang ini untuk mengembalikan sebuah tuple dengan menebak atau tidak.
Ronnie Overby
1
"Jika memiliki ekstensi maka file-nya" - ini tidak benar. File tidak harus memiliki ekstensi (bahkan di windows) dan direktori dapat memiliki "ekstensi". Misalnya ini dapat berupa file atau direktori: "C: \ New folder.log"
bytedev
2
@bytedev Saya tahu itu, tetapi pada saat itu dalam fungsi, kode menebak niat. Bahkan ada komentar yang mengatakannya. Sebagian besar file memiliki ekstensi. Sebagian besar direktori tidak.
Ronnie Overby
7

Sebagai alternatif untuk Directory.Exists (), Anda dapat menggunakan metode File.GetAttributes () untuk mendapatkan atribut file atau direktori, sehingga Anda bisa membuat metode pembantu seperti ini:

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

Anda juga bisa mempertimbangkan untuk menambahkan objek ke properti tag kontrol TreeView saat mengisi kontrol yang berisi metadata tambahan untuk item. Misalnya, Anda bisa menambahkan objek FileInfo untuk file dan objek DirectoryInfo untuk direktori dan kemudian menguji jenis item dalam properti tag untuk menyimpan membuat panggilan sistem tambahan untuk mendapatkan data saat mengklik item.

Michael A. McCloskey
sumber
2
bagaimana ini berbeda dari jawaban yang
Jake Berger
6
Daripada blok logika yang mengerikan itu, cobalahisDirectory = (fa & FileAttributes.Directory) != 0);
Immortal Blue
5

Ini adalah yang terbaik yang bisa saya lakukan dengan perilaku properti yang Ada dan Atribut:

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;
    }
}

Berikut cara pengujiannya:

    [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());
    }
HAL9000
sumber
5

Setelah menggabungkan saran dari jawaban yang lain, saya menyadari saya menemukan hal yang sama dengan jawaban Ronnie Overby . Berikut adalah beberapa tes untuk menunjukkan beberapa hal untuk dipikirkan:

  1. folder dapat memiliki "ekstensi": C:\Temp\folder_with.dot
  2. file tidak dapat diakhiri dengan pemisah direktori (slash)
  3. Secara teknis ada dua pemisah direktori yang spesifik untuk platform - mis. Mungkin garis miring atau tidak ( Path.DirectorySeparatorChardan Path.AltDirectorySeparatorChar)

Tes (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);
}

Hasil

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 

metode

/// <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;
}
drzaus
sumber
Path.DirectorySeparatorChar.ToString()bukannya string concat dengan ""?
Lewat Coding
@GoneCoding mungkin; pada saat itu saya telah bekerja dengan banyak properti nullable jadi saya punya kebiasaan "concat with string kosong" daripada khawatir tentang memeriksa null. Anda juga dapat melakukan new String(Path.DirectorySeparatorChar, 1)apa yang harus ToStringdilakukan, jika Anda ingin benar-benar dioptimalkan.
drzaus
4

Pendekatan yang paling akurat adalah menggunakan beberapa kode interop dari 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);

Anda kemudian akan menyebutnya seperti ini:

#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);
}
Scott Dorman
sumber
31
Jelek. Saya benci Interop untuk melakukan tugas-tugas sederhana ini. Dan ini tidak portabel. dan itu jelek. Apakah saya mengatakan bahwa itu jelek? :)
Ignacio Soler Garcia
5
@ SoMoS Ini mungkin "jelek" menurut Anda, tetapi masih merupakan pendekatan yang paling akurat. Ya, ini bukan solusi portabel tapi bukan itu pertanyaannya.
Scott Dorman
8
Apa maksud Anda tepatnya dengan akurat? Ini memberikan hasil yang sama seperti jawaban dari Quinn Wilson dan diperlukan interop yang merusak portabilitas. Bagi saya ini seakurat solusi lain dan memiliki efek samping yang tidak dimiliki orang lain.
Ignacio Soler Garcia
7
Ada API Kerangka untuk melakukan ini. Menggunakan Interop bukanlah cara yang tepat.
TomXP411
5
Ya ini berfungsi, tetapi BUKAN solusi "paling akurat" - tidak lebih dari menggunakan .NET Framework yang ada. Sebagai gantinya, Anda mengambil 6 baris kode untuk menggantikan apa yang dapat dilakukan dalam satu baris dengan .NET Framework, dan mengunci diri Anda menggunakan Windows saja, sebagai lawan tidak membiarkan kemampuan port ini terbuka dengan Proyek Mono. Jangan pernah gunakan Interop ketika .NET Framework menawarkan solusi yang lebih elegan.
Russ
2

Inilah yang kami gunakan:

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;
    }

  }

}
PMBotto
sumber
2

Saya menemukan ini ketika menghadapi masalah yang sama, kecuali saya perlu memeriksa apakah path untuk file atau folder ketika file atau folder itu mungkin tidak benar-benar ada . Ada beberapa komentar pada jawaban di atas yang menyebutkan mereka tidak akan bekerja untuk skenario ini. Saya menemukan solusi (saya menggunakan VB.NET, tetapi Anda dapat mengonversi jika Anda membutuhkan) yang tampaknya berfungsi dengan baik untuk saya:

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

Semoga ini bisa bermanfaat bagi seseorang!

lhan
sumber
1
sudahkah Anda mencoba metode Path.HasExtension ?
Jake Berger
Jika tidak ada, maka itu bukan file atau direktori. Nama apa pun bisa dibuat. Jika Anda ingin membuatnya, maka Anda harus tahu apa yang Anda buat, dan jika tidak, lalu mengapa Anda mungkin membutuhkan informasi ini?
Random832
8
Sebuah folder dapat dinamai test.txtdan sebuah file dapat dinamai test- dalam kasus ini kode Anda akan memberikan hasil yang salah
Stephan Bauer
2
Ada metode .Exists di kelas System.IO.FIle dan System.IO.Directory. itu yang harus dilakukan. Direktori dapat memiliki ekstensi; Saya sering melihatnya.
TomXP411
2

soooo di akhir permainan saya tahu, tapi saya pikir saya akan membagikan ini. Jika Anda hanya bekerja dengan jalur sebagai string, mencari tahu ini semudah pie:

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

misalnya: ThePath == "C:\SomeFolder\File1.txt"akan berakhir seperti ini:

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

Contoh lain: ThePath == "C:\SomeFolder\"akan berakhir seperti ini:

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

Dan ini juga akan berhasil tanpa garis miring terbalik: ThePath == "C:\SomeFolder"akan berakhir seperti ini:

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

Perlu diingat di sini bahwa ini hanya berfungsi dengan jalur itu sendiri, dan bukan hubungan antara jalur dan "cakram fisik" ... sehingga tidak dapat memberi tahu Anda jika jalur / file ada atau semacamnya, tetapi pasti dapat memberi tahu Anda jika path adalah folder atau file ...

MaxOvrdrv
sumber
2
Tidak berfungsi System.IO.FileSystemWatcherkarena sejak direktori dihapus, ia mengirim c:\my_directorysebagai argumen yang sama ketika ekstensi lebih sedikit file c:\my_directorydihapus.
Ray Cheng
GetDirectoryName('C:\SomeFolder')kembali 'C:\', jadi kasing terakhir Anda tidak berfungsi. Ini tidak membedakan antara direktori dan file tanpa ekstensi.
Lucy
Anda keliru berasumsi bahwa jalur direktori akan selalu menyertakan "\" final. Misalnya Path.GetDirectoryName("C:\SomeFolder\SomeSubFolder")akan kembali C:\SomeFolder. Perhatikan bahwa contoh Anda sendiri tentang apa yang dikembalikan oleh GetDirectoryName menunjukkan bahwa ia mengembalikan jalur yang tidak berakhir dengan garis miring terbalik. Ini berarti jika seseorang menggunakan GetDirectoryName di tempat lain untuk mendapatkan jalur direktori, dan kemudian memasukkannya ke metode Anda, mereka akan mendapatkan jawaban yang salah.
ToolmakerSteve
1

Jika Anda ingin menemukan direktori, termasuk yang bertanda "tersembunyi" dan "sistem", coba ini (memerlukan .NET V4):

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

Saya membutuhkan ini, posting membantu, ini membawanya ke satu baris, dan jika jalan itu bukan jalan sama sekali, itu hanya mengembalikan dan keluar dari metode. Ini mengatasi semua masalah di atas, tidak perlu garis miring juga.

if (!Directory.Exists(@"C:\folderName")) return;
Joe Stellato
sumber
0

Saya menggunakan yang berikut ini, ia juga menguji ekstensi yang artinya dapat digunakan untuk menguji apakah jalur yang disediakan adalah file tetapi file yang tidak ada.

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;
}
Stu1983
sumber
1
Ekstensi FileInfo adalah (IMAO) pilihan yang baik untuk memeriksa jalur yang tidak ada
dataCore
2
kondisi kedua Anda (lain) bau. jika itu bukan file yang ada maka Anda tidak tahu apa itu mungkin (direktori dapat diakhiri dengan sesuatu seperti ".txt" juga).
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));
          }
     }
}
Diaa Eddin
sumber
0

Menggunakan jawaban yang dipilih pada posting ini, saya melihat komentar dan memberikan kepercayaan kepada @ ŞafakGür, @Anthony dan @ Quinn Wilson untuk bit info mereka yang mengarahkan saya ke jawaban yang ditingkatkan ini yang saya tulis dan uji:

    /// <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;
    }
Mike Socha III
sumber
Tampaknya agak boros untuk memeriksa atribut setelah memeriksa Direktori / File Ada ()? Kedua panggilan itu sendiri melakukan semua pekerjaan yang diperlukan di sini.
Lewat Coding
0

Mungkin untuk 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;
    }
Menit V
sumber
0

Begitu ya, aku terlambat 10 tahun ke pesta. Saya menghadapi situasi, di mana dari beberapa properti saya dapat menerima nama file atau path file lengkap. Jika tidak ada jalur yang disediakan, saya harus memeriksa keberadaan file dengan melampirkan jalur direktori "global" yang disediakan oleh properti lain.

Dalam hal ini

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

melakukan trik. Oke, ini bukan sihir, tapi mungkin ini bisa menyelamatkan seseorang beberapa menit untuk mencari tahu. Karena ini hanyalah pengurai string, maka Dir-names dengan titik-titik dapat memberikan hasil positif palsu ...

dba
sumber
0

Sangat terlambat ke pesta di sini, tetapi saya telah menemukan nilai Nullable<Boolean>kembali cukup jelek - IsDirectory(string path)kembali nulltidak sama dengan jalan yang tidak ada tanpa komentar verbal, jadi saya datang dengan yang berikut:

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);
    }
}

Metode penolong ini ditulis dengan kata-kata dan cukup ringkas untuk memahami maksudnya saat pertama kali Anda membacanya.

/// <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
    }
}
martinthebeardy
sumber
-4

Bukankah ini bekerja?

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

sumber
1
Ini tidak akan berfungsi hanya karena nama folder dapat memiliki titik di dalamnya
KSib
Juga file tidak harus memiliki titik di dalamnya.
Keith Pinson