Przetwarzam TreeView
katalogi i pliki. Użytkownik może wybrać plik lub katalog, a następnie coś z nim zrobić. To wymaga ode mnie metody, która wykonuje różne działania w zależności od wyboru użytkownika.
W tej chwili robię coś takiego, aby ustalić, czy ścieżka jest plikiem, czy katalogiem:
bool bIsFile = false;
bool bIsDirectory = false;
try
{
string[] subfolders = Directory.GetDirectories(strFilePath);
bIsDirectory = true;
bIsFile = false;
}
catch(System.IO.IOException)
{
bIsFolder = false;
bIsFile = true;
}
Nie mogę się oprzeć wrażeniu, że jest na to lepszy sposób! Miałem nadzieję znaleźć standardową metodę .NET do obsługi tego, ale nie byłem w stanie tego zrobić. Czy taka metoda istnieje, a jeśli nie, jaki jest najprostszy sposób ustalenia, czy ścieżka jest plikiem czy katalogiem?
Odpowiedzi:
Od Jak stwierdzić, czy ścieżka jest plikiem czy katalogiem :
Aktualizacja dla .NET 4.0+
Zgodnie z poniższymi komentarzami, jeśli korzystasz z platformy .NET 4.0 lub nowszej (a maksymalna wydajność nie jest krytyczna), możesz napisać kod w czystszy sposób:
źródło
&
operator zwrócą wartość binarną, w której tylko bity, które są włączone (1) w obu operandach, są włączone. W takim przypadku wykonanie bitowe i wykonanie operacji przeciw,attr
aFileAttributes.Directory
wartość zwróci wartość,FileAttributes.Directory
jeśli bit atrybutu pliku katalogu jest włączony. Aby uzyskać lepsze wyjaśnienie, zobacz en.wikipedia.org/wiki/Bitwise_operation .C:\Temp
odnosi się do katalogu o nazwie,Temp
czy do pliku o nazwieTemp
. Do czego służy kod?attr.HasFlag(FileAttributes.Directory)
można zamiast niego użyć.Co powiesz na ich użycie?
źródło
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
}
Za pomocą tylko tego wiersza możesz uzyskać, jeśli ścieżka jest katalogiem lub plikiem:
źródło
To moje:
Jest podobny do odpowiedzi innych, ale nie dokładnie taki sam.
źródło
Path.DirectorySeparatorChar
iPath.AltDirectorySeparatorChar
Alternatywnie do Directory.Exists () można użyć metody File.GetAttributes (), aby uzyskać atrybuty pliku lub katalogu, aby można było utworzyć metodę pomocniczą w następujący sposób:
Można również rozważyć dodanie obiektu do właściwości tagu kontrolki TreeView podczas zapełniania kontrolki zawierającej dodatkowe metadane dla elementu. Na przykład można dodać obiekt FileInfo dla plików i obiekt DirectoryInfo dla katalogów, a następnie przetestować typ elementu we właściwości znacznika, aby zapisać wykonywanie dodatkowych wywołań systemowych w celu uzyskania tych danych po kliknięciu elementu.
źródło
isDirectory = (fa & FileAttributes.Directory) != 0);
To było najlepsze, jakie mogłem wymyślić, biorąc pod uwagę zachowanie właściwości Exists i Attributes:
Oto jak się to sprawdza:
źródło
Po połączeniu sugestii z innych odpowiedzi zdałem sobie sprawę, że wpadłem na to samo co odpowiedź Ronniego Overby'ego . Oto kilka testów wskazujących na kilka rzeczy do przemyślenia:
C:\Temp\folder_with.dot
Path.DirectorySeparatorChar
iPath.AltDirectorySeparatorChar
)Testy (Linqpad)
Wyniki
metoda
źródło
Path.DirectorySeparatorChar.ToString()
zamiast konkatowania ciągów z""
?new String(Path.DirectorySeparatorChar, 1)
tak, jak toToString
działa, jeśli chcesz naprawdę się zoptymalizować.Najdokładniejszym podejściem będzie użycie kodu interop z shlwapi.dll
Nazwałbyś to tak:
źródło
Oto, czego używamy:
źródło
Natknąłem się na to, gdy napotkałem podobny problem, z tym, że musiałem sprawdzić, czy istnieje ścieżka do pliku lub folderu, gdy ten plik lub folder może faktycznie nie istnieć . Było kilka komentarzy do odpowiedzi powyżej, które wspominały, że nie będą działać w tym scenariuszu. Znalazłem rozwiązanie (używam VB.NET, ale możesz je przekonwertować, jeśli potrzebujesz), które wydaje mi się działać dobrze:
Mam nadzieję, że może to komuś pomóc!
źródło
test.txt
i plik może być nazwanytest
- w tych przypadkach kod wróci nieprawidłowych wynikówbardzo późno w grze, wiem, ale myślałem, że i tak to podzielę. Jeśli pracujesz wyłącznie ze ścieżkami jako ciągami, znalezienie tego jest proste jak ciasto:
na przykład:
ThePath == "C:\SomeFolder\File1.txt"
byłoby tak:Kolejny przykład:
ThePath == "C:\SomeFolder\"
skończyłby się tak:I to też działałoby bez końcowego ukośnika odwrotnego: w
ThePath == "C:\SomeFolder"
końcu byłby to:Należy pamiętać, że działa to tylko z samymi ścieżkami, a nie z relacją między ścieżką a „dyskiem fizycznym” ... więc nie może powiedzieć, czy ścieżka / plik istnieje, czy coś podobnego, ale na pewno może powiedzieć, czy ścieżka jest folderem czy plikiem ...
źródło
System.IO.FileSystemWatcher
ponieważ po usunięciu katalogu wysyłac:\my_directory
jako argument, który jest taki sam, gdyc:\my_directory
usuwany jest plik bez rozszerzenia .GetDirectoryName('C:\SomeFolder')
zwraca'C:\'
, więc twoja ostatnia sprawa nie działa. Nie rozróżnia to katalogów i plików bez rozszerzeń.Path.GetDirectoryName("C:\SomeFolder\SomeSubFolder")
wróciC:\SomeFolder
. Zauważ, że twoje własne przykłady tego, co zwraca GetDirectoryName, pokazują, że zwraca ścieżkę, która nie kończy się odwrotnym ukośnikiem. Oznacza to, że jeśli ktoś użyje GetDirectoryName w innym miejscu, aby uzyskać ścieżkę do katalogu, a następnie poda ją do Twojej metody, otrzyma złą odpowiedź.Jeśli chcesz znaleźć katalogi, w tym te oznaczone jako „ukryte” i „system”, spróbuj tego (wymaga .NET V4):
źródło
Potrzebowałem tego, posty pomogły, to sprowadza się do jednej linii, a jeśli ścieżka wcale nie jest ścieżką, po prostu zwraca i wychodzi z metody. Odpowiada na wszystkie powyższe obawy, nie wymaga również ukośnika końcowego.
źródło
Korzystam z poniższych, testuje również rozszerzenie, co oznacza, że można go użyć do testowania, czy podana ścieżka to plik, ale plik, który nie istnieje.
źródło
źródło
Korzystając z wybranej odpowiedzi w tym poście, spojrzałem na komentarze i daję wiarygodność @ ŞafakGür, @Anthony i @Quinn Wilson za ich bity informacyjne, które doprowadziły mnie do tej ulepszonej odpowiedzi, którą napisałem i przetestowałem:
źródło
Może dla UWP C #
źródło
Rozumiem, jestem o 10 lat za późno na przyjęcie. Miałem do czynienia z sytuacją, w której z jakiejś nieruchomości mogę otrzymać nazwę pliku lub pełną ścieżkę pliku. Jeśli nie podano ścieżki, muszę sprawdzić istnienie pliku, dołączając „globalną” ścieżkę katalogu podaną przez inną właściwość.
W moim przypadku
wykonał lewę. Ok, to nie jest magia, ale może to uratuje komuś kilka minut na rozgryzienie. Ponieważ jest to tylko parsowanie ciągów, więc nazwy Dir z kropkami mogą dawać fałszywe alarmy ...
źródło
Bardzo późno na imprezę tutaj, ale okazało się, że
Nullable<Boolean>
zwracana wartość jest dość brzydka -IsDirectory(string path)
powrótnull
nie oznacza nieistniejącej ścieżki bez pełnych komentarzy, więc wymyśliłem następujące:Ta metoda pomocnicza jest napisana tak, aby była wystarczająco szczegółowa i zwięzła, aby zrozumieć intencję przy pierwszym czytaniu.
źródło
Czy to nie zadziała?
źródło