Подтвердить что ты не робот

Лучший способ итерации папок и подпапок

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

4b9b3361

Ответ 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, которое возвращает размер файла в байтах.

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