Как выполнить полное рекурсивное сканирование каталогов и файлов?

вот мой код:

    private static void TreeScan(string sDir)
    {
        foreach (string d in Directory.GetDirectories(sDir))
        {
            foreach (string f in Directory.GetFiles(d))
            {
                //Save file f
            }
        }
        TreeScan(d, client);
    }

Проблема заключается в том, что он не получает FILES sDir (запуск каталога), он получает только папки и файлы в подпапках.

Как я могу заставить его также получать файлы из sDir?

Ответ 1

private static void TreeScan( string sDir )
{
    foreach (string f in Directory.GetFiles( sDir ))
    {
        //Save f :)
    }
    foreach (string d in Directory.GetDirectories( sDir ))
    {
        TreeScan( d ); 
    }
}

Ответ 2

Не изобретайте колесо, используйте перегрузку GetFiles, которая позволяет указать, что он ищет подкаталоги.

string[] files 
    = Directory.GetFiles(path, searchPattern, SearchOption.AllDirectories);

Ответ 3

В коде есть некоторые проблемы. Во-первых, причина, по которой вы никогда не видели файлы из корневой папки, - это то, что вы повторяли, прежде чем делать и читать файлы. Попробуйте следующее:

public static void Main()
{
    TreeScan(@"C:\someFolder");
}

private static void TreeScan(string sDir)
{
    foreach (string f in Directory.GetFiles(sDir))
        Console.WriteLine("File: " + f); // or some other file processing

    foreach (string d in Directory.GetDirectories(sDir))
        TreeScan(d); // recursive call to get files of directory
}

Ответ 4

Вы должны использовать

Directory.GetFiles(targetDirectory);

как в Этот пример, который содержит полную реализацию того, что вы ищете

Ответ 5

Ваш цикл GetFiles должен находиться вне цикла GetDirectories. И не должен ли ваш TreeScan оставаться внутри цикла GetDirectories? Короче код должен выглядеть так:

private static void TreeScan(string sDir)
{
    foreach (string d in Directory.GetDirectories(sDir))
    {
        TreeScan(d, client);
    }
    foreach (string f in Directory.GetFiles(d))
    {
        //Save file f
    }
}

Ответ 6

Если использование Fx4 и выше метода EnumerateFiles возвратит все файлы с эффективным управлением памятью, тогда как GetFiles может потребовать максимальные ресурсы для больших каталогов (или дисков).

var files = Directory.EnumerateFiles(dir.Path, "*.*");