Saya sedang memproses TreeView
direktori 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?
Jawaban:
Dari Bagaimana cara mengetahui apakah path adalah file atau direktori :
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:
sumber
&
operator akan mengembalikan nilai biner di mana hanya bit yang aktif (1) di kedua operan dihidupkan. Dalam hal ini melakukan bitwise dan operasi terhadapattr
danFileAttributes.Directory
nilai akan mengembalikan nilaiFileAttributes.Directory
jika bit atribut file direktori dihidupkan. Lihat en.wikipedia.org/wiki/Bitwise_operation untuk penjelasan yang lebih baik.C:\Temp
merujuk ke direktori yang disebutTemp
atau file yang dipanggilTemp
. Apa yang dimaksudkan dengan kode itu?attr.HasFlag(FileAttributes.Directory)
bisa digunakan sebagai gantinya.Bagaimana kalau menggunakan ini?
sumber
File.GetAttributes()
.public static bool? IsDirectory(string path){
if (Directory.Exists(path))
return true; // is a directory
else if (File.Exists(path))
return false; // is a file
else
return null; // is a nothing
}
Dengan hanya baris ini yang bisa Anda dapatkan jika path adalah direktori atau file:
sumber
Ini milik saya:
Ini mirip dengan jawaban orang lain tetapi tidak persis sama.
sumber
Path.DirectorySeparatorChar
danPath.AltDirectorySeparatorChar
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:
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.
sumber
isDirectory = (fa & FileAttributes.Directory) != 0);
Ini adalah yang terbaik yang bisa saya lakukan dengan perilaku properti yang Ada dan Atribut:
Berikut cara pengujiannya:
sumber
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:
C:\Temp\folder_with.dot
Path.DirectorySeparatorChar
danPath.AltDirectorySeparatorChar
)Tes (Linqpad)
Hasil
metode
sumber
Path.DirectorySeparatorChar.ToString()
bukannya string concat dengan""
?new String(Path.DirectorySeparatorChar, 1)
apa yang harusToString
dilakukan, jika Anda ingin benar-benar dioptimalkan.Pendekatan yang paling akurat adalah menggunakan beberapa kode interop dari shlwapi.dll
Anda kemudian akan menyebutnya seperti ini:
sumber
Inilah yang kami gunakan:
sumber
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:
Semoga ini bisa bermanfaat bagi seseorang!
sumber
test.txt
dan sebuah file dapat dinamaitest
- dalam kasus ini kode Anda akan memberikan hasil yang salahsoooo 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:
misalnya:
ThePath == "C:\SomeFolder\File1.txt"
akan berakhir seperti ini:Contoh lain:
ThePath == "C:\SomeFolder\"
akan berakhir seperti ini:Dan ini juga akan berhasil tanpa garis miring terbalik:
ThePath == "C:\SomeFolder"
akan berakhir seperti ini: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 ...
sumber
System.IO.FileSystemWatcher
karena sejak direktori dihapus, ia mengirimc:\my_directory
sebagai argumen yang sama ketika ekstensi lebih sedikit filec:\my_directory
dihapus.GetDirectoryName('C:\SomeFolder')
kembali'C:\'
, jadi kasing terakhir Anda tidak berfungsi. Ini tidak membedakan antara direktori dan file tanpa ekstensi.Path.GetDirectoryName("C:\SomeFolder\SomeSubFolder")
akan kembaliC:\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.Jika Anda ingin menemukan direktori, termasuk yang bertanda "tersembunyi" dan "sistem", coba ini (memerlukan .NET V4):
sumber
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.
sumber
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.
sumber
sumber
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:
sumber
Mungkin untuk UWP C #
sumber
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
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 ...
sumber
Sangat terlambat ke pesta di sini, tetapi saya telah menemukan nilai
Nullable<Boolean>
kembali cukup jelek -IsDirectory(string path)
kembalinull
tidak sama dengan jalan yang tidak ada tanpa komentar verbal, jadi saya datang dengan yang berikut:Metode penolong ini ditulis dengan kata-kata dan cukup ringkas untuk memahami maksudnya saat pertama kali Anda membacanya.
sumber
Bukankah ini bekerja?
sumber