web-dev-qa-db-fra.com

Méthode pour obtenir tous les fichiers du dossier et des sous-dossiers qui renverront une liste

J'ai une méthode qui va parcourir un dossier et tous ses sous-dossiers et obtenir une liste des chemins de fichiers. Cependant, je ne pouvais comprendre que comment le créer et ajouter les fichiers à une liste publique, mais pas comment renvoyer la liste. Voici la méthode:

public List<String> files = new List<String>();

private void DirSearch(string sDir)
    {
        try
        {
            foreach (string f in Directory.GetFiles(sDir))
            {
                files.Add(f);
            }
            foreach (string d in Directory.GetDirectories(sDir))
            {
                DirSearch(d);
            }
        }
        catch (System.Exception excpt)
        {
            MessageBox.Show(excpt.Message);
        }
    }

Donc, j'appelle simplement DirSearch() à un moment donné dans mon code et cela "remplit" la liste avec les chemins, mais je veux pouvoir l'utiliser plusieurs fois pour créer différentes listes avec différents répertoires, etc.

37
Wilson
private List<String> DirSearch(string sDir)
{
    List<String> files = new List<String>();
    try
    {
        foreach (string f in Directory.GetFiles(sDir))
        {
            files.Add(f);
        }
        foreach (string d in Directory.GetDirectories(sDir))
        {
            files.AddRange(DirSearch(d));
        }
    }
    catch (System.Exception excpt)
    {
        MessageBox.Show(excpt.Message);
    }

    return files;
}

et si vous ne voulez pas charger toute la liste en mémoire et éviter le blocage, jetez un coup d’œil au following answer .

38
Darin Dimitrov

Vous pouvez utiliser Directory.GetFiles pour remplacer votre méthode.

 Directory.GetFiles(dirPath, "*", SearchOption.AllDirectories)
122
Tilak

Utilisez simplement ceci:

public static List<String> GetAllFiles(String directory)
{
    return Directory.GetFiles(directory, "*.*", SearchOption.AllDirectories).ToList();
}

Et si vous voulez tous les fichiers, même ceux sans extension:

public static List<String> GetAllFiles(String directory)
{
    return Directory.GetFiles(directory, "*", SearchOption.AllDirectories).ToList();
}
19
Tommaso Belluzzo

vous pouvez utiliser quelque chose comme ceci:

string [] filePaths = Directory.GetFiles(path, "*.*", SearchOption.AllDirectories);

au lieu d'utiliser ".", vous pouvez taper le nom du fichier ou simplement le type "* .txt" et SearchOption.AllDirectories consiste à rechercher dans tous les sous-dossiers, vous pouvez le modifier si vous n'en voulez qu'un niveau plus sur la façon de l’utiliser sur ici

12
sam

Je ne suis pas sûr de la raison pour laquelle vous ajoutez les chaînes à files, qui est déclaré sous forme de champ plutôt que de variable temporaire. Vous pouvez changer la signature de DirSearch en:

private List<string> DirSearch(string sDir)

Et, après le bloc catch, ajoutez:

return files;

Alternativement, vous pouvez créer une variable temporaire dans votre méthode et la renvoyer, ce qui me semble l’approche que vous pourriez souhaiter. Sinon, chaque fois que vous appelez cette méthode, les nouvelles chaînes trouvées seront ajoutées à la même liste qu'auparavant et vous obtiendrez des doublons.

2
Mir

Ceci est destiné à quiconque tente d'obtenir une liste de tous les fichiers d'un dossier et de ses sous-dossiers et de l'enregistrer dans un document texte. Ci-dessous se trouve le code complet, y compris les instructions «using», «namespace», «class», «méthodes», etc.____. . Cela créera un document texte contenant une liste de tous les fichiers de tous les dossiers et sous-dossiers d’un dossier racine donné. Après tout, à quoi sert une liste (comme dans Console.WriteLine) si vous ne pouvez pas faire quelque chose avec elle. Ici, j'ai créé un dossier sur le lecteur C appelé «Folder1» et créé un dossier à l'intérieur de celui-ci appelé «Folder2». Ensuite, j'ai rempli folder2 avec un tas de fichiers, dossiers et fichiers et dossiers dans ces dossiers. Cet exemple de code récupère tous les fichiers, crée une liste dans un document texte et le place dans Folder1. Attention: vous ne devez pas enregistrer le document texte dans Folder2 (le dossier à partir duquel vous lisez), ce serait tout simplement une mauvaise pratique. Toujours enregistrer dans un autre dossier.
J'espère que cela aidera quelqu'un en bout de ligne.

using System;
using System.IO;

namespace ConsoleApplication4
{
    class Program
    {
        public static void Main(string[] args)
        {
            // Create a header for your text file
            string[] HeaderA = { "****** List of Files ******" };
            System.IO.File.WriteAllLines(@"c:\Folder1\ListOfFiles.txt", HeaderA);

            // Get all files from a folder and all its sub-folders. Here we are getting all files in the folder
            // named "Folder2" that is in "Folder1" on the C: drive. Notice the use of the 'forward and back slash'.
            string[] arrayA = Directory.GetFiles(@"c:\Folder1/Folder2", "*.*", SearchOption.AllDirectories);
            {
                //Now that we have a list of files, write them to a text file.
                WriteAllLines(@"c:\Folder1\ListOfFiles.txt", arrayA);
            }

            // Now, append the header and list to the text file.
            using (System.IO.StreamWriter file =
                new System.IO.StreamWriter(@"c:\Folder1\ListOfFiles.txt"))
            {
                // First - call the header 
                foreach (string line in HeaderA)
                {
                    file.WriteLine(line);
                }

                file.WriteLine(); // This line just puts a blank space between the header and list of files. 


                // Now, call teh list of files.
                foreach (string name in arrayA)
                {
                    file.WriteLine(name);
                }

            }
          }


        // These are just the "throw new exception" calls that are needed when converting the array's to strings. 

        // This one is for the Header.
        private static void WriteAllLines(string v, string file)
        {
            //throw new NotImplementedException();
        }

        // And this one is for the list of files. 
        private static void WriteAllLines(string v, string[] arrayA)
        {
            //throw new NotImplementedException();
        }



    }
}
1
Aubrey Love

Essaye ça
programme de classe { static void Main (string [] args) {

        getfiles get = new getfiles();
        List<string> files =  get.GetAllFiles(@"D:\Rishi");

        foreach(string f in files)
        {
            Console.WriteLine(f);
        }


        Console.Read();
    }


}

class getfiles
{
    public List<string> GetAllFiles(string sDirt)
    {
        List<string> files = new List<string>();

        try
        {
            foreach (string file in Directory.GetFiles(sDirt))
            {
                files.Add(file);
            }
            foreach (string fl in Directory.GetDirectories(sDirt))
            {
                files.AddRange(GetAllFiles(fl));
            }
        }
        catch (Exception ex)
        {

            Console.WriteLine(ex.Message);
        }



        return files;
    }
}
0
Ris
String[] allfiles = System.IO.Directory.GetFiles("path/to/dir", "*.*", System.IO.SearchOption.AllDirectories);
0
veeresh i