Как я могу выполнить полное рекурсивное сканирование каталогов и файлов? - PullRequest
15 голосов
/ 07 июля 2011

вот мой код:

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

Проблема в том, что он не получает ФАЙЛОВ sDir (начальный каталог) он получает только папки и файлы во вложенных папках.

Как мне сделать так, чтобы он тоже получал файлы из sDir?

Ответы [ 6 ]

45 голосов
/ 07 июля 2011

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

string[] files 
    = Directory.GetFiles(path, searchPattern, SearchOption.AllDirectories);
9 голосов
/ 07 июля 2011
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 голосов
/ 07 июля 2011

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

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
}
1 голос
/ 07 июля 2011

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

Directory.GetFiles(targetDirectory);

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

0 голосов
/ 18 апреля 2015

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

var files = Directory.EnumerateFiles(dir.Path, "*.*");
0 голосов
/ 07 июля 2011

Ваш цикл 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
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...