Ich habe einen Pfad und muss feststellen, ob es sich um ein Verzeichnis oder eine Datei handelt.
Ist dies der beste Weg, um festzustellen, ob der Pfad eine Datei ist?
string file = @"C:\Test\foo.txt";
bool isFile = !System.IO.Directory.Exists(file) &&
System.IO.File.Exists(file);
Für ein Verzeichnis würde ich die Logik umkehren.
string directory = @"C:\Test";
bool isDirectory = System.IO.Directory.Exists(directory) &&
!System.IO.File.Exists(directory);
Wenn beides nicht existiert, werde ich keinen Zweig machen. Nehmen wir also an, dass beide existieren.
Antworten:
Verwenden:
System.IO.File.GetAttributes(string path)
und prüfen Sie, ob das zurückgegebene
FileAttributes
Ergebnis den Wert enthältFileAttributes.Directory
:bool isDir = (File.GetAttributes(path) & FileAttributes.Directory) == FileAttributes.Directory;
quelle
Directory.GetFiles
mit der Zeichenfolge aufrufen und prüfen, ob das Ergebnis eine Anzahl größer als Null hat. Ein "Pfad mit Platzhaltern" ist kein Pfad . Es ist ein Muster .Ich denke, dies ist der einfachste Weg, bei dem Sie nur zwei Überprüfungen benötigen:
string file = @"C:\tmp"; if (System.IO.Directory.Exists(file)) { // do stuff when file is an existing directory } else if (System.IO.File.Exists(file)) { // do stuff when file is an existing file }
quelle
1
für Verzeichnis,2
Datei und0
Fehler zurückzukehren (z. B. ist der Name ungültig). Das Tool ist winzig (338 Byte Quelle, 3584 Byte kompiliert) und läuft sehr schnell.Sie können dies mit einem Interop-Code tun:
[DllImport("shlwapi.dll", CharSet = CharSet.Unicode)] [return: MarshalAsAttribute(UnmanagedType.Bool)] public static extern bool PathIsDirectory([MarshalAsAttribute(UnmanagedType.LPWStr), In] string pszPath);
Um einige der Kommentare weiter zu verdeutlichen ...
Das Einführen von nicht verwaltetem Code ist nicht gefährlicher als alle anderen Datei- oder E / A-bezogenen Aufrufe in .NET, da letztendlich alle nicht verwalteten Code aufrufen.
Dies ist ein einzelner Funktionsaufruf mit einer Zeichenfolge. Durch Aufrufen dieser Funktion werden keine neuen Datentypen und / oder Speichernutzung eingeführt. Ja, Sie müssen sich auf den nicht verwalteten Code verlassen, um ordnungsgemäß zu bereinigen, aber letztendlich haben Sie diese Abhängigkeit von den meisten E / A-bezogenen Aufrufen.
Als Referenz finden Sie hier den Code für File.GetAttributes (Zeichenfolgenpfad) von Reflector:
public static FileAttributes GetAttributes(string path) { string fullPathInternal = Path.GetFullPathInternal(path); new FileIOPermission(FileIOPermissionAccess.Read, new string[] { fullPathInternal }, false, false).Demand(); Win32Native.WIN32_FILE_ATTRIBUTE_DATA data = new Win32Native.WIN32_FILE_ATTRIBUTE_DATA(); int errorCode = FillAttributeInfo(fullPathInternal, ref data, false, true); if (errorCode != 0) { __Error.WinIOError(errorCode, fullPathInternal); } return (FileAttributes) data.fileAttributes; }
Wie Sie sehen können, wird auch nicht verwalteter Code aufgerufen, um die Dateiattribute abzurufen. Daher sind die Argumente zur Einführung von nicht verwaltetem Code, der gefährlich ist, ungültig. Ebenso das Argument, vollständig im verwalteten Code zu bleiben. Hierfür gibt es keine Implementierung von verwaltetem Code. Selbst das Aufrufen von File.GetAttributes (), wie in den anderen Antworten vorgeschlagen, hat die gleichen "Probleme" beim Aufrufen von nicht geändertem Code, und ich glaube, dies ist die zuverlässigere Methode, um festzustellen, ob ein Pfad ein Verzeichnis ist.
Bearbeiten Um den Kommentar von @Christian K zu CAS zu beantworten. Ich glaube, der einzige Grund, warum GetAttributes die Sicherheitsanforderung stellt, ist, dass es die Eigenschaften der Datei lesen muss, um sicherzustellen, dass der aufrufende Code die Berechtigung dazu hat. Dies ist nicht dasselbe wie die zugrunde liegenden Betriebssystemprüfungen (falls vorhanden). Sie können jederzeit eine Wrapper-Funktion um den P / Invoke-Aufruf von PathIsDirectory erstellen, die bei Bedarf auch bestimmte CAS-Berechtigungen erfordert.
quelle
Angenommen, das Verzeichnis existiert ...
bool isDir = (File.GetAttributes(path) & FileAttributes.Directory) == FileAttributes.Directory;
quelle
Überprüfen Sie dies heraus:
/// <summary> /// Returns true if the given file path is a folder. /// </summary> /// <param name="Path">File path</param> /// <returns>True if a folder</returns> public bool IsFolder(string path) { return ((File.GetAttributes(path) & FileAttributes.Directory) == FileAttributes.Directory); }
von http://www.jonasjohn.de/snippets/csharp/is-folder.htm
quelle
Lesen Sie die Dateiattribute:
FileAttributes att = System.IO.File.GetAttributes(PATH_TO_FILE);
Suchen Sie nach dem Verzeichnisflag .
quelle
Da eine bestimmte Pfadzeichenfolge nicht sowohl ein Verzeichnis als auch eine Datei darstellen kann, funktioniert das Folgende einwandfrei und öffnet die Tür für andere Vorgänge.
bool isFile = new FileInfo(path).Exists; bool isDir = new DirectoryInfo(path).Exists;
Wenn Sie mit dem Dateisystem arbeiten, ist die Verwendung von
FileInfo
undDirectoryInfo
viel einfacher als die Verwendung von Zeichenfolgen.quelle
Hmm, es sieht so aus, als hätte die
Files
Klasse (injava.nio
) tatsächlich eine statischeisDirectory
Methode. Ich denke, Sie könnten tatsächlich Folgendes verwenden:Path what = ... boolean isDir = Files.isDirectory(what);
quelle