Comment lister récursivement tous les fichiers d'un répertoire en C #?

315

Comment lister récursivement tous les fichiers d'un répertoire et les répertoires enfants en C #?

Jim McKeeth
la source
1
Où voulez-vous peupler? si arbre ... voici l'exemple dreamincode.net/code/snippet2591.htm
Arsen Mkrtchyan
77
string [] filenames = Directory.GetFiles (path, "*", SearchOption.AllDirectories)
Bruce
Vous voudrez peut-être regarder cette question où j'ai présenté un exemple de code qui utilise la récursivité pour rendre une structure de répertoire dans un TreeView. La logique devrait être la même dans la plupart des cas.
Cerebrus
5
Le problème c'est qu'il se casse très facilement si vous n'avez pas accès à un seul répertoire: pas de résultats ...
Marc Gravell
1
Si vous rencontrez des problèmes lorsque certains fichiers ne sont pas accessibles, consultez Enumerating Files Throwing Exception
CodesInChaos

Réponses:

186

Cet article couvre tout ce dont vous avez besoin. Sauf au lieu de rechercher les fichiers et de comparer les noms, il suffit d'imprimer les noms.

Il peut être modifié comme suit:

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

Ajouté par barlop

GONeale mentionne que ce qui précède ne répertorie pas les fichiers dans le répertoire actuel et suggère de placer la partie de liste de fichiers en dehors de la partie qui obtient les répertoires. Ce qui suit ferait cela. Il comprend également une ligne Writeline que vous pouvez décommenter, qui aide à tracer où vous êtes dans la récursivité qui peut aider à afficher les appels pour aider à montrer comment fonctionne la récursivité.

            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);
                }
            }
John T
la source
86
Cette méthode ne répertorie pas les fichiers pour le répertoire initial, seulement ses sous-répertoires et inférieurs. Je déplacerais GetFiles en dehors de GetDirectories
GONeale
1
Parfois, on ne veut pas les fichiers du répertoire initial, auquel cas c'est parfait pour des structures raisonnablement petites. Pour les très grandes listes, utilisez quelque chose comme la solution de Marc Gravell: stackoverflow.com/a/929418/91189
Joseph Gabriel
2
@GONeale est correct. Il est beaucoup moins plausible pour un utilisateur de ne pas s'attendre à la liste des fichiers du répertoire racine d'entrée. Le mot entrée est la clé ici. Il a été saisi pour une raison.
Florin Mircea
2
J'ai dû ajouter une prise d'essai autour de la boucle foreach intérieure sinon cela ne continue pas d'erreurs d'accès refusé
Shaun Vermaak
3
Vous devriez éviter d'attraper une exception - voudriez-vous vraiment attraper une OutOfMemoryException par exemple? N'attrapez que ce que vous pouvez gérer.
alastairtree
435

Notez que dans .NET 4.0, il existe (soi-disant) des fonctions de fichier basées sur un itérateur (plutôt que sur un tableau) intégrées:

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

Pour le moment, j'utiliserais quelque chose comme ci-dessous; la méthode récursive intégrée se casse trop facilement si vous n'avez pas accès à un seul sous-répertoire ...; l' Queue<string>utilisation évite trop de récursivité de la pile d'appels, et le bloc itérateur nous évite d'avoir un énorme tableau.

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];
            }
        }
    }
}
Marc Gravell
la source
1
@soandos Sur le point de réparation récursif EnumerateFiles lève une exception IOException "Le nom du fichier ne peut pas être résolu par le système"
SerG
5
Pour tous ceux qui veulent savoir si *.*comprend également des fichiers sans extension de fichier: Oui, il a été testé il y a une minute.
Tobias Knauss
1
Pour l'utiliser, vous devrez ajouterusing System.IO;
Rétablir Monica - Au revoir SE
7
@Wikis et pour l'utiliser, Consolevous devrez ajouter using System;- mais comme l'EDI peut ajouter toutes les usingdirectives nécessaires pour vous (ctrl +.), Et puisque nous n'utilisons rien d'exotique ici, il est courant de ne pas les inclure. Heck, vous aurez également besoin d'une classdéfinition, etc. Just sayin '
Marc Gravell
1
@MarcGravell Nous sommes dans le monde .net et Visual Studio Code maintenant, donc inclure des instructions Using est toujours le bienvenu dans tout exemple de code .net pour enregistrer une série de recherches et un "rasage de yak" inutile
JohnC
98
Directory.GetFiles("C:\\", "*.*", SearchOption.AllDirectories)
Pescuma
la source
2
Comment éviter l'erreur si l'utilisateur connecté n'a pas accès à certains dossiers.
Romil Kumar Jain
5
@Romil Je ne crois pas que cet extrait de code essaie d'indiquer toutes les fonctionnalités, uniquement la fonctionnalité brute que l'OP recherchait. Merci du partage, Pescuma!
kayleeFrye_onDeck
@kayleeFrye_onDeck, je mets seulement une préoccupation au cas où il y aurait une augmentation pour l'un des dossiers lors de l'obtention des fichiers. En raison de cette préoccupation, nous implémentons notre fonction récursive personnalisée.
Romil Kumar Jain
3
Vous recevrez "UnauthorizedAccessException" avec cette solution. Vous devriez avoir une solution capable de gérer des erreurs comme celle-ci.
Kairan
13

Dans .NET 4.5, au moins, il y a cette version qui est beaucoup plus courte et a l'avantage supplémentaire d'évaluer tous les critères de fichier à inclure dans la liste:

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

Utilisez comme ceci:

var list = GetAllFiles(mask, (info) => Path.GetExtension(info.Name) == ".html").ToList();
John Kaster
la source
Cela ne gère pas un cas où vous avez un répertoire vide ... il n'y a pas de déclaration de retour à l'intérieur de la fonction.
FrumkinWY
@FrumkinWY que se passe-t-il avec un répertoire vide? Je n'ai pas de machine à portée de main pour tester cela maintenant.
John Kaster
12
IEnumerable<string> GetFilesFromDir(string dir) =>
 Directory.EnumerateFiles(dir).Concat(
 Directory.EnumerateDirectories(dir)
          .SelectMany(subdir => GetFilesFromDir(subdir)));
Raz Megrelidze
la source
3

Dans Framework 2.0, vous pouvez utiliser (il répertorie les fichiers du dossier racine, c'est la meilleure réponse la plus populaire):

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);
    }
}
Hernaldo Gonzalez
la source
3

Quelques excellentes réponses mais ces réponses n'ont pas résolu mon problème.

Dès qu'un problème d'autorisation de dossier survient: "Autorisation refusée" le code échoue. Voici ce que j'avais l'habitude de contourner le problème "Autorisation refusée":

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

J'espère que cela aide les autres.

clou rouillé
la source
3

Une solution simple et propre

/// <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);
    }
}
Sunil Purushothaman
la source
3
Vous faites manuellement ce que DirectoryInfo.GetFiles () fera pour vous dès la sortie de la boîte - utilisez simplement la surcharge avec SearchOption.AllDirectories et il récurrera tout seul. C'est donc une solution compliquée .
philw
2

Je préfère utiliser DirectoryInfo car je peux obtenir des FileInfo, pas seulement des chaînes.

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

        string searchPattern = "*.xml";

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

Je le fais au cas où à l'avenir j'aurais besoin d'un filtrage futur ... basé sur les propriétés de 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();

Je peux également recourir à des cordes si besoin est. (et je suis toujours à l'épreuve du temps pour les filtres / trucs de clause where.

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

Notez que " . " Est un modèle de recherche valide si vous souhaitez classer par extension.

granadaCoder
la source
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)
    {

    }
}
psdehr
la source
1
Pourquoi le paramètre filesest-il ref? Il n'y a pas besoin.
Massimiliano Kraus
@MassimilianoKraus Je dirais que, bien que cela ne soit pas obligatoire, il est plus clair que sa méthode va changer fileset que vous ne pouvez plus simplement donner new List<FileInfo>()comme paramètre qui serait inutile. Peut permettre une sous-optimisation et éviter de créer un nouvel objet, sauf si cela est nécessaire.
jeromej
@JeromeJ si vous savez ce qu'est la POO, vous savez que chaque fois que vous passez un objet à une méthode, cette méthode peut changer les propriétés / champs de l'objet. Donc, refcela ne clarifie rien. Le refbut est de changer le filespointeur entier même pour l'appelant de la méthode: c'est une opération dangereuse et ici il n'y a pas besoin de cela: vous pouvez simplement remplir la liste, vous n'avez pas besoin de la rediriger vers une autre liste sur le tas. refne doit être utilisé que dans des cas très particuliers; la plupart du temps, il vous suffit d'implémenter les choses de manière plus fonctionnelle.
Massimiliano Kraus
1

Pour éviter cela UnauthorizedAccessException, j'utilise:

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;
        }
    }
}
Fidel
la source
1

Si vous n'avez besoin que de noms de fichiers et comme je n'aimais pas vraiment la plupart des solutions ici (en termes de fonctionnalités ou de lisibilité), qu'en est-il de celle paresseuse?

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;
    }
  }
}
jeromej
la source
1

Record le plus court

string files = Directory.GetFiles(@"your_path", "*.jpg", SearchOption.AllDirectories);
Viktor Miroshnikov
la source
0

Voici mon point de vue à ce sujet, basé sur celui d'Hernaldo, si vous avez besoin de trouver des fichiers avec des noms d'un certain modèle, tels que des fichiers XML qui quelque part dans leur nom contiennent une chaîne particulière:

// 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;
}
Clay Shannon
la source
0

Liste des fichiers et dossiers à modéliser, implémentation personnalisée.
Cela crée une liste complète de tous les fichiers et dossiers à partir de votre répertoire de démarrage.

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
    }

Méthode:

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

Usage:

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

            dir = DirSearch(dir);
c_wiz_kid
la source
0

Solution courte et simple

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);
Nitin Sawant
la source
0

Celui-ci m'a aidé à obtenir tous les fichiers dans un répertoire et des sous-répertoires, peut être utile pour quelqu'un. [Inspiré des réponses ci-dessus]

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);
        }
    }
}
Akbar Badhusha
la source
0
var d = new DirectoryInfo(@"C:\logs");
var list = d.GetFiles("*.txt").Select(m => m.Name).ToList();
Sameera R.
la source
0

Une version améliorée avec max lvl pour descendre dans le répertoire et option pour exclure les dossiers:

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

répertoire d'entrée:

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

sortie de la fonction (le contenu du dossier5 est exclu en raison de la limite de niveau et le contenu du dossier3 est exclu car il se trouve dans le tableau des dossiers exclus):

-folder1
  file1.txt
  -folder2
    file2.txt
    -folder5
  -folder3
  -folder4
    file4.txt
    file5.txt
brainoverflow98
la source
-1

Voici une version du code de B. Clay Shannon non statique pour les fichiers Excel:

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;
    }
Sardoan
la source
-1

Une solution très simple, renvoie une liste de fichiers.

    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;
    }
jamie yello
la source
-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();
        }
Goutham Padmanabha
la source
1
euhhh ... ce n'est pas récursif
mxmissile