Wie rekursiv Liste alle Dateien in einem Verzeichnis und untergeordneten Verzeichnissen in C#?
Antworten
Zu viele Anzeigen?Beachten Sie, dass in .NET 4.0 (angeblich) Iterator-basierte (und nicht Array-basierte) Dateifunktionen eingebaut sind:
foreach (string file in Directory.EnumerateFiles(path, "*.*", SearchOption.AllDirectories))
{
Console.WriteLine(file);
}
Im Moment würde ich etwas wie unten verwenden; die eingebaute rekursive Methode bricht zu leicht ab, wenn Sie keinen Zugriff auf ein einzelnes Unterverzeichnis haben...; die Queue<string>
Verwendung vermeidet zu viel Call-Stack-Rekursion, und der Iterator-Block verhindert, dass wir ein riesiges Array haben.
static void Main() {
foreach (string file in GetFiles(SOME_PATH)) {
Console.WriteLine(file);
}
}
static IEnumerable<string> GetFiles(string path) {
Queue<string> queue = new Queue<string>();
queue.Enqueue(path);
while (queue.Count > 0) {
path = queue.Dequeue();
try {
foreach (string subDir in Directory.GetDirectories(path)) {
queue.Enqueue(subDir);
}
}
catch(Exception ex) {
Console.Error.WriteLine(ex);
}
string[] files = null;
try {
files = Directory.GetFiles(path);
}
catch (Exception ex) {
Console.Error.WriteLine(ex);
}
if (files != null) {
for(int i = 0 ; i < files.Length ; i++) {
yield return files[i];
}
}
}
}
Dieser Artikel deckt alles ab, was Sie brauchen. Aber anstatt die Dateien zu durchsuchen und die Namen zu vergleichen, drucken Sie einfach die Namen aus.
Sie kann wie folgt geändert werden:
static void DirSearch(string sDir)
{
try
{
foreach (string d in Directory.GetDirectories(sDir))
{
foreach (string f in Directory.GetFiles(d))
{
Console.WriteLine(f);
}
DirSearch(d);
}
}
catch (System.Exception excpt)
{
Console.WriteLine(excpt.Message);
}
}
Hinzugefügt von barlop
GONeale erwähnt, dass die obige Methode nicht die Dateien im aktuellen Verzeichnis auflistet und schlägt vor, den Teil, der die Dateien auflistet, außerhalb des Teils zu platzieren, der die Verzeichnisse auflistet. Das Folgende würde das tun. Es enthält auch eine Writeline-Zeile, die Sie auskommentieren können, um zu verfolgen, wo Sie sich in der Rekursion befinden, was helfen kann, die Aufrufe zu zeigen, um zu zeigen, wie die Rekursion funktioniert.
DirSearch_ex3("c:\\aaa");
static void DirSearch_ex3(string sDir)
{
//Console.WriteLine("DirSearch..(" + sDir + ")");
try
{
Console.WriteLine(sDir);
foreach (string f in Directory.GetFiles(sDir))
{
Console.WriteLine(f);
}
foreach (string d in Directory.GetDirectories(sDir))
{
DirSearch_ex3(d);
}
}
catch (System.Exception excpt)
{
Console.WriteLine(excpt.Message);
}
}
Zumindest in .NET 4.5 gibt es diese Version, die viel kürzer ist und den zusätzlichen Vorteil hat, dass sie alle Dateikriterien für die Aufnahme in die Liste auswertet:
public static IEnumerable<string> GetAllFiles(string path,
Func<FileInfo, bool> checkFile = null)
{
string mask = Path.GetFileName(path);
if (string.IsNullOrEmpty(mask)) mask = "*.*";
path = Path.GetDirectoryName(path);
string[] files = Directory.GetFiles(path, mask, SearchOption.AllDirectories);
foreach (string file in files)
{
if (checkFile == null || checkFile(new FileInfo(file)))
yield return file;
}
}
So verwenden:
var list = GetAllFiles(mask, (info) => Path.GetExtension(info.Name) == ".html").ToList();
- See previous answers
- Weitere Antworten anzeigen