Перебирать файлы на определенном уровне - PullRequest
0 голосов
/ 24 декабря 2011

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

    Iterate(bool count)
    {
       foreach (string dir in Directory.GetDirectories(root))
          foreach (string subdir in Directory.GetDirectories(dir))
             foreach (string file in Directory.GetFiles(subdir))
             {
                if (count) progressBar.Maximum++;          
                else 
                {
                   //do operations
                }
             }
    }

Мне интересно, есть ли лучший способ сделать это. Конечно, должен быть лучший способ, чем добавление foreach для каждого уровня папки ..?

Ответы [ 5 ]

0 голосов
/ 24 декабря 2011

запишите это вместо вашего кода

string [] files = Directory.GetFile("yourDirectory","*.*",SearchOptions.AllDirectories);

это вернет все файлы в подкаталогах вместо использования рекурсии

0 голосов
/ 24 декабря 2011

вы можете скачать беглую вещь, которую я написал для System.IO (см. Здесь: http://blog.staticvoid.co.nz/2011/11/staticvoid-io-extentions-nuget.html), а затем использовать этот оператор LINQ

        var files = from d in di.Directories()
                    from dir in d.Directories()
                    from f in dir.Files()
                    select f;
0 голосов
/ 24 декабря 2011

Документация Directory.GetFiles показывает, как рекурсивно выполнять итерацию дерева каталогов

0 голосов
/ 24 декабря 2011

Мне было бы проще использовать LINQ здесь.

var files = 
    (from dir in Directory.GetDirectories(root)
     from subdir in Directory.GetDirectories(dir)
     from f in Directory.GetFiles(subdir)
     select f).ToList();

var fileCount = files.Length;
foreach (var f in files) {
    ...
}
0 голосов
/ 24 декабря 2011

Перед началом работы с GetFiles попробуйте следующее:

string [] fileEntries = Directory.GetFiles(subdir);
int intFileCount = fileEntries.length;

Или может заменить его, если цикл служит только для подсчета файлов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...