Лучший способ перебирать папки и подпапки - PullRequest
32 голосов
/ 03 марта 2011

Каков наилучший способ итерации папок и подпапок для получения размера файла, общего количества файлов и общего размера папки в каждой папке, начиная с указанного местоположения?

Ответы [ 5 ]

43 голосов
/ 03 марта 2011

Если вы используете .NET 4, вы можете использовать методы System.IO.DirectoryInfo.EnumerateDirectories и System.IO.DirectoryInfo.EnumerateFiles.Если вы используете метод Directory.GetFiles, как рекомендовали другие публикации, вызов метода не вернется, пока он не получит ВСЕ записи.Это может занять много времени, если вы используете рекурсию.

Из документации :

Методы EnumerateFiles и GetFiles отличаются следующим образом:

  • Когда вы используете EnumerateFiles, вы можете начать перечисление коллекции FileInfo объектов до того, как будет возвращена вся коллекция.
  • Когда вы используете GetFiles, вы должны подождатьдля всего массива FileInfo объектов, которые должны быть возвращены до того, как вы сможете получить доступ к массиву.

Поэтому, когда вы работаете со многими файлами и каталогами, EnumerateFiles может быть более эффективным.

29 голосов
/ 03 марта 2011

Использовать Directory.GetFiles () . Я полагаю, что в нижней части этой страницы приведен полностью рекурсивный пример.

5 голосов
/ 03 марта 2011

Для перебора всех каталогов и подпапок и файлов, независимо от того, сколько подпапок и файлов.

string [] filenames;
 fname = Directory.GetFiles(jak, "*.*", SearchOption.AllDirectories).Select(x => Path.GetFileName(x)).ToArray();

, затем из массива вы можете получить то, что вы хотите, с помощью цикла или по вашему желанию.

2 голосов
/ 03 марта 2011

Обратите внимание, что вам нужно будет выполнить проверки правильности.

string[] fileNames = Directory.GetFiles("c:\\", "*.*", SearchOption.AllDirectories);
int fileCount = fileNames.Count();
long fileSize = fileNames.Select(file => new FileInfo(file).Length).Sum(); // in bytes
1 голос
/ 03 марта 2011

Для перебора файлов и папок вы обычно используете типы DirectoryInfo и FileInfo . Тип FileInfo имеет свойство Length, которое возвращает размер файла в байтах.

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

...