Ich möchte alle Dateien und Verzeichnisse auflisten, die in einem Verzeichnis und in Unterverzeichnissen dieses Verzeichnisses enthalten sind. Wenn ich C: \ als Verzeichnis wählen würde, würde das Programm jeden Namen jeder Datei und jedes Ordners auf der Festplatte erhalten, auf die es Zugriff hatte.
Eine Liste könnte so aussehen
fd \ 1.txt fd \ 2.txt fd \ a \ fd \ b \ fd \ a \ 1.txt fd \ a \ 2.txt fd \ a \ a \ fd \ a \ b \ fd \ b \ 1.txt fd \ b \ 2.txt fd \ b \ a fd \ b \ b fd \ a \ a \ 1.txt fd \ a \ a \ a \ fd \ a \ b \ 1.txt fd \ a \ b \ a fd \ b \ a \ 1.txt fd \ b \ a \ a \ fd \ b \ b \ 1.txt fd \ b \ b \ a
c#
directory
subdirectory
getdirectories
derp_in_mouth
quelle
quelle
Antworten:
Wo
*.*
ist das Muster, um Dateien abzugleichen?Wenn das Verzeichnis auch benötigt wird, können Sie folgendermaßen vorgehen:
quelle
Lsit<>
Klasse? Was gibt GetFiles zurück? Und was ist mit den Verzeichnisnamen, die ebenfalls angefordert wurden?GetFiles
Methode gibt ein String-Array zurück.Directory.GetFileSystemEntries
existiert in .NET 4.0+ und gibt sowohl Dateien als auch Verzeichnisse zurück. Nennen Sie es so:Beachten Sie, dass es nicht mit Versuchen fertig wird, den Inhalt von Unterverzeichnissen aufzulisten, auf die Sie keinen Zugriff haben (UnauthorizedAccessException), aber möglicherweise für Ihre Anforderungen ausreichend ist.
quelle
Verwenden Sie die Methoden
GetDirectories
undGetFiles
, um die Ordner und Dateien abzurufen.Verwenden Sie die , um die Ordner und Dateien auch in den Unterordnern abzurufen.
SearchOption
AllDirectories
quelle
Path
bietet zuverlässigere Methoden.Path
, um einen festen linken Teil des Pfades zu entfernen, z. B. "C:" im angegebenen Beispiel.path.SubString(2)
, um Laufwerksbuchstaben und Doppelpunkt naiv zu entfernen? Was ist, wenn das Verzeichnis eine Netzwerkfreigabe ist? Ich schlagePath
als zuverlässige Methode vor, weil sie in diesem Bereich viele Extras liefern kann. In diesem Fall können Sie schreibenfilePath.Substring(Path.GetPathRoot(filePath).Length)
. Ja, hier wird Teilzeichenfolge verwendet, da dies am präzisesten ist.quelle
Ich fürchte, die
GetFiles
Methode gibt eine Liste der Dateien zurück, aber nicht die Verzeichnisse. Die Liste in der Frage fordert mich auf, dass das Ergebnis auch die Ordner enthalten sollte. Wenn Sie mehr benutzerdefinierte Liste möchten, können Sie versuchen, rufenGetFiles
undGetDirectories
rekursiv. Versuche dies:Tipp: Sie können
FileInfo
undDirectoryInfo
Klassen verwenden, wenn Sie ein bestimmtes Attribut überprüfen müssen.quelle
Sie können FindFirstFile verwenden, das ein Handle zurückgibt und dann rekursiv eine Funktion aufruft, die FindNextFile aufruft. Dies ist ein guter Ansatz, da die referenzierte Struktur mit verschiedenen Daten wie alternativeName, lastTmeCreated, modifiziert, Attributen usw. Gefüllt wird
Wenn Sie jedoch das .net-Framework verwenden, müssen Sie den nicht verwalteten Bereich betreten.
quelle
Einige verbesserte Versionen mit maximaler Stufe, um in das Verzeichnis zu gelangen, und Option zum Ausschließen von Ordnern:
Eingabeverzeichnis:
Ausgabe der Funktion (Inhalt von Ordner5 ist aufgrund des Level-Limits ausgeschlossen und Inhalt von Ordner3 ist ausgeschlossen, da er sich im Array "Ausgeschlossene Ordner" befindet):
quelle
Wenn Sie keinen Zugriff auf einen Unterordner in der Verzeichnisstruktur haben, stoppt Directory.GetFiles und löst die Ausnahme aus, die zu einem Nullwert in der empfangenden Zeichenfolge [] führt.
Hier finden Sie diese Antwort unter https://stackoverflow.com/a/38959208/6310707
Es verwaltet die Ausnahme innerhalb der Schleife und arbeitet weiter, bis der gesamte Ordner durchlaufen wird.
quelle
der logische und geordnete Weg:
quelle
Im folgenden Beispiel werden Dateien und Unterordner in einem Verzeichnisbaum, der Ausnahmen behandelt, am schnellsten (nicht parallelisiert) aufgelistet. Es wäre schneller, Directory.EnumerateDirectories mit SearchOption.AllDirectories zu verwenden, um alle Verzeichnisse aufzulisten. Diese Methode schlägt jedoch fehl, wenn eine UnauthorizedAccessException oder PathTooLongException auftritt.
Verwendet den generischen Stack-Auflistungstyp, bei dem es sich um einen LIFO-Stapel (Last In First Out) handelt und der keine Rekursion verwendet. Unter https://msdn.microsoft.com/en-us/library/bb513869.aspx können Sie alle Unterverzeichnisse und Dateien auflisten und diese Ausnahmen effektiv behandeln.
quelle
Ich verwende den folgenden Code mit einem Formular, das zwei Schaltflächen enthält, eine zum Beenden und eine zum Starten. Ein Ordner-Browser-Dialog und ein Dialogfeld zum Speichern von Dateien. Der Code ist unten aufgeführt und funktioniert auf meinem System Windows 10 (64):
quelle
quelle
Ein kleines bisschen einfach und langsam, aber es funktioniert !! Wenn Sie keinen Dateipfad angeben, verwenden Sie grundsätzlich den "fixPath". Dies ist nur ein Beispiel. Sie können den richtigen Dateityp suchen, den Sie möchten. Ich habe einen Fehler gemacht, als ich den Listennamen ausgewählt habe, da die "temporäre Dateiliste" die gesuchte Dateiliste ist also mach weiter .... und die "errorList" spricht für sich
quelle
Liste der Zeichenfolgen erstellen
quelle
dir / s / b . > results.txt
/ s = Unterordner / b = Ergebnisse tragen
quelle