Ich verarbeite a TreeView
von Verzeichnissen und Dateien. Ein Benutzer kann entweder eine Datei oder ein Verzeichnis auswählen und dann etwas damit tun. Dies erfordert eine Methode, die je nach Auswahl des Benutzers verschiedene Aktionen ausführt.
Im Moment mache ich so etwas, um festzustellen, ob der Pfad eine Datei oder ein Verzeichnis ist:
bool bIsFile = false;
bool bIsDirectory = false;
try
{
string[] subfolders = Directory.GetDirectories(strFilePath);
bIsDirectory = true;
bIsFile = false;
}
catch(System.IO.IOException)
{
bIsFolder = false;
bIsFile = true;
}
Ich kann nicht anders, als das Gefühl zu haben, dass es einen besseren Weg gibt, dies zu tun! Ich hatte gehofft, eine Standard-.NET-Methode zu finden, um dies zu handhaben, aber ich war nicht in der Lage, dies zu tun. Gibt es eine solche Methode, und wenn nicht, was ist das einfachste Mittel, um festzustellen, ob ein Pfad eine Datei oder ein Verzeichnis ist?
Antworten:
Von So erkennen Sie, ob der Pfad eine Datei oder ein Verzeichnis ist :
Update für .NET 4.0+
Wenn Sie unter .NET 4.0 oder höher arbeiten (und die maximale Leistung nicht kritisch ist), können Sie den Code gemäß den folgenden Kommentaren sauberer schreiben:
quelle
&
Operator und der Operator geben einen Binärwert zurück, bei dem nur die Bits aktiviert sind, die in beiden Operanden aktiviert sind (1). In diesem Fall führt eine bitweise Operation und eine Operation gegenattr
und derFileAttributes.Directory
Wert den Wert zurück,FileAttributes.Directory
wenn das Attributbit der Verzeichnisdatei aktiviert ist. Eine bessere Erklärung finden Sie unter en.wikipedia.org/wiki/Bitwise_operation .C:\Temp
auf ein Verzeichnis namensTemp
oder eine Datei namens verwiesen wirdTemp
. Was soll der Code tun?attr.HasFlag(FileAttributes.Directory)
stattdessen verwendet werden.Wie wäre es mit diesen?
quelle
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
}
Mit nur dieser Zeile können Sie erhalten, ob ein Pfad ein Verzeichnis oder eine Datei ist:
quelle
Hier ist meins:
Es ähnelt den Antworten anderer, ist aber nicht genau gleich.
quelle
Path.DirectorySeparatorChar
undPath.AltDirectorySeparatorChar
Alternativ zu Directory.Exists () können Sie die File.GetAttributes () -Methode verwenden, um die Attribute einer Datei oder eines Verzeichnisses abzurufen. So können Sie eine Hilfsmethode wie die folgende erstellen:
Sie können auch ein Objekt zur Tag-Eigenschaft des TreeView-Steuerelements hinzufügen, wenn Sie das Steuerelement füllen, das zusätzliche Metadaten für das Element enthält. Sie können beispielsweise ein FileInfo-Objekt für Dateien und ein DirectoryInfo-Objekt für Verzeichnisse hinzufügen und dann in der Tag-Eigenschaft auf den Elementtyp testen, um zusätzliche Systemaufrufe zu sparen, um diese Daten beim Klicken auf das Element abzurufen.
quelle
isDirectory = (fa & FileAttributes.Directory) != 0);
Dies war das Beste, was ich angesichts des Verhaltens der Eigenschaften Exists und Attribute finden konnte:
So testet es:
quelle
Nachdem ich die Vorschläge aus den anderen Antworten kombiniert hatte, stellte ich fest, dass ich ungefähr das Gleiche fand wie Ronnie Overbys Antwort . Hier sind einige Tests, um auf einige Dinge hinzuweisen, über die Sie nachdenken sollten:
C:\Temp\folder_with.dot
Path.DirectorySeparatorChar
undPath.AltDirectorySeparatorChar
)Tests (Linqpad)
Ergebnisse
Methode
quelle
Path.DirectorySeparatorChar.ToString()
statt string concat mit""
?new String(Path.DirectorySeparatorChar, 1)
, was Sie tunToString
, wenn Sie wirklich optimiert werden möchten.Der genaueste Ansatz ist die Verwendung von Interop-Code aus der shlwapi.dll
Sie würden es dann so nennen:
quelle
Folgendes verwenden wir:
quelle
Ich bin darauf gestoßen, als ich auf ein ähnliches Problem gestoßen bin, außer dass ich überprüfen musste, ob ein Pfad für eine Datei oder einen Ordner vorhanden ist, wenn diese Datei oder dieser Ordner möglicherweise nicht vorhanden ist . Zu den obigen Antworten gab es einige Kommentare, in denen erwähnt wurde, dass sie für dieses Szenario nicht funktionieren würden. Ich habe eine Lösung gefunden (ich verwende VB.NET, aber Sie können sie bei Bedarf konvertieren), die für mich gut zu funktionieren scheint:
Hoffentlich kann dies jemandem helfen!
quelle
test.txt
und eine Datei kann benannt werdentest
- in diesen Fällen der Code falsche Ergebnisse zurückgeben würdeSoooo spät im Spiel weiß ich, aber ich dachte, ich würde das trotzdem teilen. Wenn Sie nur mit den Pfaden als Zeichenfolgen arbeiten, ist es ganz einfach, dies herauszufinden:
Zum Beispiel:
ThePath == "C:\SomeFolder\File1.txt"
würde am Ende folgendes sein:Ein anderes Beispiel:
ThePath == "C:\SomeFolder\"
würde am Ende folgendes sein:Und dies würde auch ohne den nachfolgenden Backslash funktionieren:
ThePath == "C:\SomeFolder"
Am Ende wäre dies:Denken Sie hier daran, dass dies nur mit den Pfaden selbst funktioniert und nicht mit der Beziehung zwischen dem Pfad und der "physischen Festplatte". Sie können also nicht sagen, ob der Pfad / die Datei vorhanden ist oder ähnliches, aber es ist sicher kann Ihnen sagen, ob der Pfad ein Ordner oder eine Datei ist ...
quelle
System.IO.FileSystemWatcher
da beim Löschen eines Verzeichnissesc:\my_directory
ein Argument gesendet wird, das beimc:\my_directory
Löschen einer Datei ohne Erweiterung identisch ist.GetDirectoryName('C:\SomeFolder')
kehrt zurück'C:\'
, sodass Ihr letzter Fall nicht funktioniert. Dies unterscheidet nicht zwischen Verzeichnissen und Dateien ohne Erweiterungen.Path.GetDirectoryName("C:\SomeFolder\SomeSubFolder")
Wird zum Beispiel zurückkehrenC:\SomeFolder
. Beachten Sie, dass Ihre eigenen Beispiele für die Rückgabe von GetDirectoryName zeigen, dass ein Pfad zurückgegeben wird, der nicht mit einem Backslash endet. Das heißt, wenn jemand GetDirectoryName an anderer Stelle verwendet, um einen Verzeichnispfad abzurufen, und ihn dann Ihrer Methode zuführt, erhält er die falsche Antwort.Wenn Sie Verzeichnisse suchen möchten, einschließlich solcher, die als "versteckt" und "system" gekennzeichnet sind, versuchen Sie Folgendes (erfordert .NET V4):
quelle
Ich brauchte das, die Beiträge haben geholfen, das bringt es auf eine Zeile, und wenn der Pfad überhaupt kein Pfad ist, kehrt er einfach zurück und beendet die Methode. Es behebt alle oben genannten Probleme und benötigt auch keinen abschließenden Schrägstrich.
quelle
Ich verwende Folgendes, es testet auch die Erweiterung, was bedeutet, dass es zum Testen verwendet werden kann, ob der angegebene Pfad eine Datei ist, aber eine Datei, die nicht existiert.
quelle
quelle
Unter Verwendung der ausgewählten Antwort in diesem Beitrag habe ich mir die Kommentare angesehen und @ ŞafakGür, @Anthony und @Quinn Wilson für ihre Infobits, die mich zu dieser verbesserten Antwort führten, die ich geschrieben und getestet habe, Glauben geschenkt:
quelle
Vielleicht für UWP C #
quelle
Ich sehe, ich bin 10 Jahre zu spät zur Party. Ich war mit der Situation konfrontiert, dass ich von einer Eigenschaft entweder einen Dateinamen oder einen vollständigen Dateipfad erhalten kann. Wenn kein Pfad angegeben ist, muss ich die Dateiexistenz überprüfen, indem ich einen "globalen" Verzeichnispfad anhänge, der von einer anderen Eigenschaft bereitgestellt wird.
In meinem Fall
hat den Trick gemacht. Ok, es ist keine Magie, aber vielleicht könnte dies jemandem ein paar Minuten Zeit sparen, um es herauszufinden. Da dies nur ein String-Parsing ist, können Dir-Namen mit Punkten falsch positive Ergebnisse liefern ...
quelle
Sehr spät zur Party hier, aber ich fand den
Nullable<Boolean>
Rückgabewert ziemlich hässlich - dasIsDirectory(string path)
Zurückgebennull
entspricht nicht einem nicht existierenden Pfad ohne ausführliche Kommentare, daher habe ich mir Folgendes ausgedacht:Diese Hilfsmethode ist so geschrieben, dass sie ausführlich und präzise genug ist, um die Absicht beim ersten Lesen zu verstehen.
quelle
Würde das nicht funktionieren?
quelle