Vraag Methode om alle bestanden binnen de map en submappen te krijgen die een lijst retourneren


Ik heb een methode die een map en alle bijbehorende submappen doorloopt en een lijst van de bestandspaden krijgt. Ik kon echter alleen achterhalen hoe ik het moest maken en de bestanden aan een openbare lijst toevoegen, maar niet hoe ik de lijst moest retourneren. Dit is de methode:

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

Dus ik bel gewoon DirSearch() op een bepaald punt in mijn code en het vult de lijst met de paden, maar ik wil het meerdere keren kunnen gebruiken om verschillende lijsten met verschillende mappen te maken, enz.


31
2018-01-13 16:37


oorsprong


antwoorden:


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

en als je de hele lijst niet in het geheugen wilt laden en niet wilt blokkeren, bekijk dan de following answer.


36
2018-01-13 16:40



Je kunt gebruiken Directory.GetFiles om je methode te vervangen.

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

111
2018-01-13 16:40



Gebruik gewoon dit:

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

En als je elk bestand wilt, zelfs uitbreidingen zonder extensie:

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

18
2018-01-13 16:45



je kunt zoiets als dit gebruiken:

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

in plaats van gebruiken "."je kunt de naam van het bestand typen of alleen het type zoals" * .txt " ook SearchOption.AllDirectories is om in alle submappen te zoeken, je kunt dat veranderen als je maar één niveau wilt meer over hoe je het kunt gebruiken hier


12
2017-12-07 00:54



Ik weet niet zeker waarom je de strings toevoegt files, dat wordt verklaard als een veld in plaats van een tijdelijke variabele. Je zou de handtekening van kunnen veranderen DirSearch naar:

private List<string> DirSearch(string sDir)

En na de catch blokkeren, toevoegen:

return files;

Je kunt ook een tijdelijke variabele binnen in je methode maken en deze retourneren, wat voor mij de benadering lijkt die je misschien zou willen. Anders, elke keer dat u die methode aanroept, zullen de nieuw gevonden strings aan dezelfde lijst worden toegevoegd als voorheen en zult u duplicaten hebben.


2
2018-01-13 16:39



Probeer dit
 klasprogramma     {         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
2017-11-30 06:20



String[] allfiles = System.IO.Directory.GetFiles("path/to/dir", "*.*", System.IO.SearchOption.AllDirectories);

0
2017-09-03 01:48



Dit is voor iedereen die probeert een lijst te krijgen van alle bestanden in een map en zijn submappen en deze op te slaan in een tekstdocument. Hieronder staat de volledige code inclusief de "gebruik" -instructies, "naamruimte", "klasse", "methoden" enz. Ik probeerde zoveel mogelijk commentaar te geven in de hele code, zodat je kon begrijpen wat elk onderdeel aan het doen is. Hiermee wordt een tekstdocument gemaakt met een lijst met alle bestanden in alle mappen en submappen van een bepaalde hoofdmap. Wat is immers een goede lijst (zoals in Console.WriteLine) als je er niets mee kunt doen. Hier heb ik een map op de C-schijf gemaakt met de naam "Map1" en een map gemaakt in die ene map "Map2". Vervolgens heb ik folder2 gevuld met een aantal bestanden, mappen en bestanden en mappen in die mappen. Deze voorbeeldcode krijgt alle bestanden en maakt een lijst in een tekstdocument en plaatst dat tekstdocument in Map1. Let op: u moet het tekstdocument niet opslaan in Folder2 (de map waaruit u leest), dat zou gewoon een slechte oefening zijn. Bewaar het altijd in een andere map.
Ik hoop dat dit iemand langs de lijn helpt.

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



    }
}

0
2018-04-03 17:39