Каков наилучший способ перебора папок и подпапок для получения размера файла, общего количества файлов и общего размера папки в каждой папке, начинающейся в указанном месте?
Лучший способ итерации папок и подпапок
Ответ 1
Используйте Directory.GetFiles(). Я считаю, что нижняя часть этой страницы содержит полностью рекурсивный пример:
// For Directory.GetFiles and Directory.GetDirectories
// For File.Exists, Directory.Exists
using System;
using System.IO;
using System.Collections;
public class RecursiveFileProcessor
{
public static void Main(string[] args)
{
foreach(string path in args)
{
if(File.Exists(path))
{
// This path is a file
ProcessFile(path);
}
else if(Directory.Exists(path))
{
// This path is a directory
ProcessDirectory(path);
}
else
{
Console.WriteLine("{0} is not a valid file or directory.", path);
}
}
}
// Process all files in the directory passed in, recurse on any directories
// that are found, and process the files they contain.
public static void ProcessDirectory(string targetDirectory)
{
// Process the list of files found in the directory.
string [] fileEntries = Directory.GetFiles(targetDirectory);
foreach(string fileName in fileEntries)
ProcessFile(fileName);
// Recurse into subdirectories of this directory.
string [] subdirectoryEntries = Directory.GetDirectories(targetDirectory);
foreach(string subdirectory in subdirectoryEntries)
ProcessDirectory(subdirectory);
}
// Insert logic for processing found files here.
public static void ProcessFile(string path)
{
Console.WriteLine("Processed file '{0}'.", path);
}
}
Ответ 2
Если вы используете .NET 4, вы можете использовать методы System.IO.DirectoryInfo.EnumerateDirectories
и System.IO.DirectoryInfo.EnumerateFiles
. Если вы используете метод Directory.GetFiles
, как рекомендовали другие сообщения, вызов метода не будет возвращен до тех пор, пока он не восстановит ВСЕ записи. Это может занять много времени, если вы используете рекурсию.
Из документации:
Методы
EnumerateFiles
иGetFiles
различаются следующим образом:
- Когда вы используете
EnumerateFiles
, вы можете начать перечислять коллекцию объектовFileInfo
до того, как вся коллекция будет вернулся.- Когда вы используете
GetFiles
, вы должны дождаться возвращения всего массива объектовFileInfo
, прежде чем вы сможете получить доступ к массиву.Поэтому, когда вы работаете со многими файлами и каталогами,
EnumerateFiles
может быть более эффективным.
Ответ 3
Итерировать все папки и файлы каталогов, независимо от того, сколько подпапок и файлов.
string [] filenames;
fname = Directory.GetFiles(jak, "*.*", SearchOption.AllDirectories).Select(x => Path.GetFileName(x)).ToArray();
то из массива вы можете получить то, что хотите, через цикл или как хотите.
Ответ 4
Обратите внимание, что вам необходимо выполнить проверки проверки.
string[] fileNames = Directory.GetFiles("c:\\", "*.*", SearchOption.AllDirectories);
int fileCount = fileNames.Count();
long fileSize = fileNames.Select(file => new FileInfo(file).Length).Sum(); // in bytes
Ответ 5
Чтобы перебирать файлы и папки, вы обычно используете DirectoryInfo и FileInfo. Тип FileInfo имеет свойство Length, которое возвращает размер файла в байтах.
Я думаю, что вы должны написать свой собственный код, чтобы перебирать файлы и вычислять общий размер файла, но он должен быть довольно простой рекурсивной функцией.