Wie liste ich rekursiv alle Dateien in einem Verzeichnis in C # auf?


315

Wie liste ich rekursiv alle Dateien in einem Verzeichnis und untergeordnete Verzeichnisse in C # auf?


1
Wo möchten Sie bevölkern? if tree ... hier ist das Beispiel dreamincode.net/code/snippet2591.htm
Arsen Mkrtchyan

77
string [] filenames = Directory.GetFiles (Pfad, "*", SearchOption.AllDirectories)
Bruce

Vielleicht möchten Sie sich diese Frage ansehen , in der ich ein Codebeispiel vorgestellt habe, das mithilfe der Rekursion eine Verzeichnisstruktur in einer TreeView rendert. Die Logik sollte in den meisten Fällen dieselbe sein.
Cerebrus

5
Das Problem dabei ist, dass es sehr leicht kaputt geht, wenn Sie keinen Zugriff auf ein einzelnes Verzeichnis haben: keine Ergebnisse ...
Marc Gravell

1
Wenn Sie auf Probleme
stoßen,

Antworten:


186

Dieser Artikel behandelt alles, was Sie brauchen. Im Gegensatz zum Durchsuchen der Dateien und Vergleichen von Namen drucken Sie einfach die Namen aus.

Es 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 oben die Dateien im aktuellen Verzeichnis nicht aufgelistet sind, und schlägt vor, den Teil der Dateiliste außerhalb des Teils zu platzieren, der Verzeichnisse erhält. 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, und um die Aufrufe anzuzeigen und die Funktionsweise der Rekursion zu veranschaulichen.

            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);
                }
            }

86
Diese Methode listet keine Dateien für das ursprüngliche Verzeichnis auf, sondern nur die Unterverzeichnisse und niedriger. Ich würde GetFiles außerhalb von GetDirectories verschieben
GONeale

1
Manchmal möchte man die Dateien für das Anfangsverzeichnis nicht. In diesem Fall ist dies perfekt für relativ kleine Strukturen. Verwenden Sie für sehr große Listen die Lösung von Marc Gravell: stackoverflow.com/a/929418/91189
Joseph Gabriel

2
@ Goneale ist richtig. Es ist für einen Benutzer viel weniger plausibel, die Dateiliste des eingegebenen Stammverzeichnisses nicht zu erwarten. Die Worteingabe ist hier der Schlüssel. Es wurde aus einem bestimmten Grund eingegeben.
Florin Mircea

2
Ich musste einen Try-Catch um die innere foreach-Schleife hinzufügen, sonst wird der Zugriff auf verweigerte Fehler nicht fortgesetzt
Shaun Vermaak

3
Sie sollten es vermeiden, eine Ausnahme abzufangen. Möchten Sie beispielsweise wirklich eine OutOfMemoryException abfangen? Fangen Sie nur, was Sie handhaben können.
Alastairtree

433

Beachten Sie, dass in .NET 4.0 (angeblich) iteratorbasierte (und nicht arraybasierte) Dateifunktionen integriert sind:

foreach (string file in Directory.EnumerateFiles(path, "*.*", SearchOption.AllDirectories))
{
    Console.WriteLine(file);
}

Im Moment würde ich so 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 Iteratorblock vermeidet, 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];
            }
        }
    }
}

1
@soandos Am rekursiven Reparaturpunkt löst EnumerateFiles eine IOException aus "Der Name der Datei kann vom System nicht aufgelöst werden"
SerG

5
Für alle, die wissen wollen, ob sie *.*auch Dateien ohne Dateierweiterung enthalten: Ja, vor einer Minute getestet.
Tobias Knauss

1
Um dies zu nutzen, müssen Sie hinzufügenusing System.IO;
Reinstate Monica - Goodbye SE

7
@Wikis und zur Verwendung müssen ConsoleSie hinzufügen using System;- aber da die IDE alle erforderlichen usingAnweisungen für Sie hinzufügen kann (Strg +.) Und wir hier nichts Exotisches verwenden, ist es üblich, sie nicht einzuschließen. Du brauchst auch eine classDefinition usw. Sag einfach '
Marc Gravell

1
@MarcGravell Wir befinden uns jetzt in der .net-Kern- und Visual Studio-Code-Welt. Daher ist es in jedem Beispiel-.net-Code immer willkommen, Anweisungen zu verwenden, um eine Reihe von Suchvorgängen und sinnloses "Yak-Rasieren" zu
speichern

97
Directory.GetFiles("C:\\", "*.*", SearchOption.AllDirectories)

2
So vermeiden Sie den Fehler, wenn der angemeldete Benutzer auf einige Ordner keinen Zugriff hat.
Romil Kumar Jain

5
@Romil Ich glaube nicht, dass dieses Code-Snippet versucht, die volle Funktionalität anzuzeigen, nur die Roh-Funktionalität, die das OP gesucht hat. Danke fürs Teilen, Pescuma!
KayleeFrye_onDeck

@kayleeFrye_onDeck, ich habe nur Bedenken, falls beim Abrufen von Dateien für einen der Ordner eine Erhöhung erfolgt. Aus diesem Grund implementieren wir unsere benutzerdefinierte rekursive Funktion.
Romil Kumar Jain

3
Mit dieser Lösung erhalten Sie "UnauthorizedAccessException". Sie sollten eine Lösung haben, die solche Fehler behandeln kann.
Kairan

13

Zumindest in .NET 4.5 gibt es diese Version, die viel kürzer ist und den zusätzlichen Vorteil hat, dass alle Dateikriterien für die Aufnahme in die Liste bewertet werden:

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;
    }
}

Verwenden Sie wie folgt:

var list = GetAllFiles(mask, (info) => Path.GetExtension(info.Name) == ".html").ToList();

Dies behandelt keinen Fall, in dem Sie ein leeres Verzeichnis haben ... es gibt keine return-Anweisung in der Funktion.
FrumkinWY

@FrumkinWY was passiert mit einem leeren Verzeichnis? Ich habe keine Maschine zur Hand, um dies zu testen.
John Kaster

12
IEnumerable<string> GetFilesFromDir(string dir) =>
 Directory.EnumerateFiles(dir).Concat(
 Directory.EnumerateDirectories(dir)
          .SelectMany(subdir => GetFilesFromDir(subdir)));

3

In Framework 2.0 können Sie Folgendes verwenden (Es listet Dateien des Stammordners auf, am besten die beliebteste Antwort):

static void DirSearch(string dir)
{
    try
    {
        foreach (string f in Directory.GetFiles(dir))
            Console.WriteLine(f);
        foreach (string d in Directory.GetDirectories(dir))
        {
            Console.WriteLine(d);
            DirSearch(d);
        }

    }
    catch (System.Exception ex)
    {
        Console.WriteLine(ex.Message);
    }
}

3

Einige ausgezeichnete Antworten, aber diese Antworten haben mein Problem nicht gelöst.

Sobald ein Problem mit der Ordnerberechtigung auftritt: "Berechtigung verweigert", schlägt der Code fehl. Dies ist, was ich verwendet habe, um das Problem "Berechtigung verweigert" zu umgehen:

private int counter = 0;

    private string[] MyDirectories = Directory.GetDirectories("C:\\");

    private void ScanButton_Click(object sender, EventArgs e)
    {
        Thread MonitorSpeech = new Thread(() => ScanFiles());
        MonitorSpeech.Start();
    }

    private void ScanFiles()
    {
        string CurrentDirectory = string.Empty;

        while (counter < MyDirectories.Length)
        {
            try
            {
                GetDirectories();
                CurrentDirectory = MyDirectories[counter++];
            }
            catch
            {
                if (!this.IsDisposed)
                {
                    listBox1.Invoke((MethodInvoker)delegate { listBox1.Items.Add("Access Denied to : " + CurrentDirectory); });
                }
            }
        }
    }

    private void GetDirectories()
    {
        foreach (string directory in MyDirectories)
        {
            GetFiles(directory);
        }
    }

    private void GetFiles(string directory)
    {
        try
        {
            foreach (string file in Directory.GetFiles(directory, "*"))
            {
                listBox1.Invoke((MethodInvoker)delegate { listBox1.Items.Add(file); });
            }
        }
        catch
        {
            listBox1.Invoke((MethodInvoker)delegate { listBox1.Items.Add("Access Denied to : " + directory); });
        }
    }

Hoffe das hilft anderen.


3

Eine einfache und saubere Lösung

/// <summary>
/// Scans a folder and all of its subfolders recursively, and updates the List of files
/// </summary>
/// <param name="sFullPath">Full path of the folder</param>
/// <param name="files">The list, where the output is expected</param>
internal static void EnumerateFiles(string sFullPath, List<FileInfo> fileInfoList)
{
    try
    {
        DirectoryInfo di = new DirectoryInfo(sFullPath);
        FileInfo[] files = di.GetFiles();

        foreach (FileInfo file in files)
            fileInfoList.Add(file);

        //Scan recursively
        DirectoryInfo[] dirs = di.GetDirectories();
        if (dirs == null || dirs.Length < 1)
            return;
        foreach (DirectoryInfo dir in dirs)
            EnumerateFiles(dir.FullName, fileInfoList);

    }
    catch (Exception ex)
    {
        Logger.Write("Exception in Helper.EnumerateFiles", ex);
    }
}

3
Sie tun manuell, was DirectoryInfo.GetFiles () sofort für Sie erledigt - verwenden Sie einfach die Überladung mit SearchOption.AllDirectories und es wird alles von selbst wiederkehren. Das ist also eine komplizierte Lösung.
Philw

2

Ich bevorzuge die Verwendung von DirectoryInfo, da ich FileInfos erhalten kann, nicht nur Zeichenfolgen.

        string baseFolder = @"C:\temp";
        DirectoryInfo di = new DirectoryInfo(baseFolder);

        string searchPattern = "*.xml";

        ICollection<FileInfo> matchingFileInfos = di.GetFiles(searchPattern, SearchOption.AllDirectories)
            .Select(x => x)
            .ToList();

Ich mache dies für den Fall, dass ich in Zukunft eine zukünftige Filterung benötige. Basierend auf den Eigenschaften von FileInfo.

        string baseFolder = @"C:\temp";
        DirectoryInfo di = new DirectoryInfo(baseFolder);

        string searchPattern = "*.xml";

        ICollection<FileInfo> matchingFileInfos = di.GetFiles(searchPattern, SearchOption.AllDirectories)
            .Where(x => x.LastWriteTimeUtc < DateTimeOffset.Now)
            .Select(x => x)
            .ToList();

Bei Bedarf kann ich auch auf Strings zurückgreifen. (und bin immer noch zukunftssicher für Filter / Where-Klausel-Sachen.

        string baseFolder = @"C:\temp";
        DirectoryInfo di = new DirectoryInfo(baseFolder);

        string searchPattern = "*.xml";

        ICollection<string> matchingFileNames = di.GetFiles(searchPattern, SearchOption.AllDirectories)
            .Select(x => x.FullName)
            .ToList();

Beachten Sie, dass " . " Ein gültiges Suchmuster ist, wenn Sie nach Erweiterung filern möchten.


1
private void GetFiles(DirectoryInfo dir, ref List<FileInfo> files)
{
    try
    {
        files.AddRange(dir.GetFiles());
        DirectoryInfo[] dirs = dir.GetDirectories();
        foreach (var d in dirs)
        {
            GetFiles(d, ref files);
        }
    }
    catch (Exception e)
    {

    }
}

1
Warum der Parameter filesist ref? Es besteht kein Bedarf.
Massimiliano Kraus

@MassimilianoKraus Ich würde argumentieren, dass es, obwohl es nicht erforderlich ist, klarer macht, dass sich seine Methode ändert filesund Sie nicht mehr nur new List<FileInfo>()als Parameter angeben können, was nutzlos wäre. Könnte eine Unteroptimierung zulassen und das Erstellen eines neuen Objekts vermeiden, sofern dies nicht erforderlich ist.
Jeromej

@JeromeJ Wenn Sie wissen, was OOP ist, wissen Sie, dass diese Methode die Eigenschaften / Felder des Objekts ändern kann, wenn Sie ein Objekt an eine Methode übergeben. Macht refalso nichts klarer. Der refZweck besteht darin, den gesamten filesZeiger auch für den Aufrufer der Methode zu ändern : Es ist eine gefährliche Operation, und hier besteht keine Notwendigkeit dafür: Sie können die Liste einfach füllen, Sie müssen sie nicht erneut auf eine andere Liste verweisen der Haufen. refsollte nur in ganz bestimmten Fällen verwendet werden; Meistens müssen Sie die Dinge nur auf eine funktionalere Art und Weise implementieren.
Massimiliano Kraus

1

Um das zu vermeiden UnauthorizedAccessException, benutze ich:

var files = GetFiles(@"C:\", "*.*", SearchOption.AllDirectories);
foreach (var file in files)
{
    Console.WriteLine($"{file}");
}

public static IEnumerable<string> GetFiles(string path, string searchPattern, SearchOption searchOption)
{
    var foldersToProcess = new List<string>()
    {
        path
    };

    while (foldersToProcess.Count > 0)
    {
        string folder = foldersToProcess[0];
        foldersToProcess.RemoveAt(0);

        if (searchOption.HasFlag(SearchOption.AllDirectories))
        {
            //get subfolders
            try
            {
                var subfolders = Directory.GetDirectories(folder);
                foldersToProcess.AddRange(subfolders);
            }
            catch (Exception ex)
            {
                //log if you're interested
            }
        }

        //get files
        var files = new List<string>();
        try
        {
            files = Directory.GetFiles(folder, searchPattern, SearchOption.TopDirectoryOnly).ToList();
        }
        catch (Exception ex)
        {
            //log if you're interested
        }

        foreach (var file in files)
        {
            yield return file;
        }
    }
}

1

Wenn Sie nur Dateinamen benötigen und mir die meisten Lösungen hier nicht wirklich gefallen haben (in Bezug auf Funktionen oder Lesbarkeit), wie wäre es dann mit dieser faulen Lösung?

private void Foo()
{
  var files = GetAllFiles("pathToADirectory");
  foreach (string file in files)
  {
      // Use can use Path.GetFileName() or similar to extract just the filename if needed
      // You can break early and it won't still browse your whole disk since it's a lazy one
  }
}

/// <exception cref="T:System.IO.DirectoryNotFoundException">The specified path is invalid (for example, it is on an unmapped drive).</exception>
/// <exception cref="T:System.UnauthorizedAccessException">The caller does not have the required permission.</exception>
/// <exception cref="T:System.IO.IOException"><paramref name="path" /> is a file name.-or-A network error has occurred.</exception>
/// <exception cref="T:System.IO.PathTooLongException">The specified path, file name, or both exceed the system-defined maximum length. For example, on Windows-based platforms, paths must be less than 248 characters and file names must be less than 260 characters.</exception>
/// <exception cref="T:System.ArgumentNullException"><paramref name="path" /> is null.</exception>
/// <exception cref="T:System.ArgumentException"><paramref name="path" /> is a zero-length string, contains only white space, or contains one or more invalid characters as defined by <see cref="F:System.IO.Path.InvalidPathChars" />.</exception>
[NotNull]
public static IEnumerable<string> GetAllFiles([NotNull] string directory)
{
  foreach (string file in Directory.GetFiles(directory))
  {
    yield return file; // includes the path
  }

  foreach (string subDir in Directory.GetDirectories(directory))
  {
    foreach (string subFile in GetAllFiles(subDir))
    {
      yield return subFile;
    }
  }
}

1

Kürzeste Aufzeichnung

string files = Directory.GetFiles(@"your_path", "*.jpg", SearchOption.AllDirectories);

0

Hier ist mein Blickwinkel darauf, basierend auf Hernaldos, wenn Sie Dateien mit Namen eines bestimmten Musters suchen müssen, z. B. XML-Dateien, die irgendwo in ihrem Namen eine bestimmte Zeichenfolge enthalten:

// call this like so: GetXMLFiles("Platypus", "C:\\");
public static List<string> GetXMLFiles(string fileType, string dir)
{
    string dirName = dir; 
    var fileNames = new List<String>();
    try
    {
        foreach (string f in Directory.GetFiles(dirName))
        {
            if ((f.Contains(fileType)) && (f.Contains(".XML")))
            {
                fileNames.Add(f);
            }
        }
        foreach (string d in Directory.GetDirectories(dirName))
        {
            GetXMLFiles(fileType, d);
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
    return fileNames;
}

0

Auflisten von Dateien und Ordnern zum Modellieren, benutzerdefinierte Implementierung.
Dadurch wird eine vollständige Liste aller Dateien und Ordner erstellt, die in Ihrem Startverzeichnis beginnen.

public class DirOrFileModel
    {
        #region Private Members

        private string _name;
        private string _location;
        private EntryType _entryType;

        #endregion

        #region Bindings

        public string Name
        {
            get { return _name; }
            set
            {
                if (value == _name) return;
                _name = value;
            }
        }

        public string Location
        {
            get { return _location; }
            set
            {
                if (value == _location) return;
                _location = value;
            }
        }

        public EntryType EntryType
        {
            get { return _entryType; }
            set
            {
                if (value == _entryType) return;
                _entryType = value;
            }
        }

        public ObservableCollection<DirOrFileModel> Entries { get; set; }

        #endregion

        #region Constructor

        public DirOrFileModel()
        {
            Entries = new ObservableCollection<DirOrFileModel>();
        }

        #endregion
    }

    public enum EntryType
    {
        Directory = 0,
        File = 1
    }

Methode:

 static DirOrFileModel DirSearch(DirOrFileModel startDir)
        {
            var currentDir = startDir;
            try
            {
                foreach (string d in Directory.GetDirectories(currentDir.Location))
                {
                    var newDir = new DirOrFileModel
                    {
                        EntryType = EntryType.Directory,
                        Location = d,
                        Name = Path.GetFileName(d)
                    };
                    currentDir.Entries.Add(newDir);

                    DirSearch(newDir);
                }

                foreach (string f in Directory.GetFiles(currentDir.Location))
                {
                    var newFile = new DirOrFileModel
                    {
                        EntryType = EntryType.File,
                        Location = f,
                        Name = Path.GetFileNameWithoutExtension(f)
                    };
                    currentDir.Entries.Add(newFile);
                }

            }
            catch (Exception excpt)
            {
                Console.WriteLine(excpt.Message);
            }
            return startDir;
        }

Verwendungszweck:

var dir = new DirOrFileModel
            {
                Name = "C",
                Location = @"C:\",
                EntryType = EntryType.Directory
            };

            dir = DirSearch(dir);

0

Kurze und einfache Lösung

string dir = @"D:\PATH";

DateTime from_date = DateTime.Now.Date;
DateTime to_date = DateTime.Now.Date.AddHours(23);
var files = Directory.EnumerateFiles(dir, "*.*",SearchOption.AllDirectories).Select(i=>new FileInfo(i))
.Where(file=>file.LastWriteTime >= from_date && file.LastWriteTime <= to_date);
foreach(var fl in files)
    Console.WriteLine(fl.FullName);

0

Dieser hat mir geholfen, alle Dateien in ein Verzeichnis und Unterverzeichnisse zu bekommen. Kann für jemanden hilfreich sein. [Inspiriert von den obigen Antworten]

static void Main(string[] args)
    {
        try
        {
            var root = @"G:\logs";
            DirectorySearch(root);
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
        Console.ReadKey();
    }





public static void DirectorySearch(string root, bool isRootItrated = false)
{
    if (!isRootItrated)
    {
        var rootDirectoryFiles = Directory.GetFiles(root);
        foreach (var file in rootDirectoryFiles)
        {
            Console.WriteLine(file);
        } 
    }

    var subDirectories = Directory.GetDirectories(root);
    if (subDirectories?.Any() == true)
    {
        foreach (var directory in subDirectories)
        {
            var files = Directory.GetFiles(directory);
            foreach (var file in files)
            {
                Console.WriteLine(file);
            }
            DirectorySearch(directory, true);
        }
    }
}

0
var d = new DirectoryInfo(@"C:\logs");
var list = d.GetFiles("*.txt").Select(m => m.Name).ToList();

0

Einige verbesserte Versionen mit maximaler Stufe, um in das Verzeichnis zu gelangen, und Option zum Ausschließen von Ordnern:

using System;
using System.IO;

class MainClass {
  public static void Main (string[] args) {

    var dir = @"C:\directory\to\print";
    PrintDirectoryTree(dir, 2, new string[] {"folder3"});
  }


  public static void PrintDirectoryTree(string directory, int lvl, string[] excludedFolders = null, string lvlSeperator = "")
  {
    excludedFolders = excludedFolders ?? new string[0];

    foreach (string f in Directory.GetFiles(directory))
    {
        Console.WriteLine(lvlSeperator+Path.GetFileName(f));
    } 

    foreach (string d in Directory.GetDirectories(directory))
    {
        Console.WriteLine(lvlSeperator + "-" + Path.GetFileName(d));

        if(lvl > 0 && Array.IndexOf(excludedFolders, Path.GetFileName(d)) < 0)
        {
          PrintDirectoryTree(d, lvl-1, excludedFolders, lvlSeperator+"  ");
        }
    }
  }
}

Eingabeverzeichnis:

-folder1
  file1.txt
  -folder2
    file2.txt
    -folder5
      file6.txt
  -folder3
    file3.txt
  -folder4
    file4.txt
    file5.txt

Ausgabe der Funktion (Inhalt von Ordner5 wird aufgrund des Level-Limits ausgeschlossen und Inhalt von Ordner3 wird ausgeschlossen, da er sich im Array "Ausgeschlossene Ordner" befindet):

-folder1
  file1.txt
  -folder2
    file2.txt
    -folder5
  -folder3
  -folder4
    file4.txt
    file5.txt

-1

Hier ist eine Version von B. Clay Shannons Code, die für Excel-Dateien nicht statisch ist:

class ExcelSearcher
{
    private List<string> _fileNames;

    public ExcelSearcher(List<string> filenames)
    {
        _fileNames = filenames;
    }
    public List<string> GetExcelFiles(string dir, List<string> filenames = null)
    {

        string dirName = dir;
        var dirNames = new List<string>();
        if (filenames != null)
        {
            _fileNames.Concat(filenames);
        }
        try
        {
            foreach (string f in Directory.GetFiles(dirName))
            {
                if (f.ToLower().EndsWith(".xls") || f.ToLower().EndsWith(".xlsx"))
                {
                    _fileNames.Add(f);
                }
            }
            dirNames = Directory.GetDirectories(dirName).ToList();
            foreach (string d in dirNames)
            {
                GetExcelFiles(d, _fileNames);
            }
        }
        catch (Exception ex)
        {
            //Bam
        }
        return _fileNames;
    }

-1

Eine sehr einfache Lösung, die eine Liste von Dateien zurückgibt.

    public static List<string> AllFilesInFolder(string folder)
    {
        var result = new List<string>();

        foreach (string f in Directory.GetFiles(folder))
        {
            result.Add(f);
        }

        foreach (string d in Directory.GetDirectories(folder))
        {
            result.AddRange(AllFilesInFolder(d));
        }

        return result;
    }

-2
static void Main(string[] args)
        {
            string[] array1 = Directory.GetFiles(@"D:\");
            string[] array2 = System.IO.Directory.GetDirectories(@"D:\");
            Console.WriteLine("--- Files: ---");
            foreach (string name in array1)
            {
                Console.WriteLine(name);
            }
            foreach (string name in array2)
            {
                Console.WriteLine(name);
            }
                  Console.ReadLine();
        }

1
uhhh ... das ist nicht rekursiv
mxmissile
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.