общий размер и количество файлов по типу в C # - PullRequest
1 голос
/ 16 августа 2011

Я ветеринар Java, но новичок в .NET. Мне нужно собрать общий размер и количество файлов по типу и общий итог в C #. Есть ли лучший способ, чем рекурсивный поиск? Также мне нужно найти несколько типов. Подойдет ли HashTable для загрузки с моими расширениями и обновлениями?

void DirSearch(string sDir) 
{
try 
{
   foreach (string d in Directory.GetDirectories(sDir)) 
   {
    FileInfo[] fiArr = d.GetFiles();
    foreach (string f in fiArr) 
    {
       String ext = Path.GetExtension(f.Name);
       if (myht.ContainsKey(ext)
       {
        myht[ext] = myht[ext] + f.Length;
       }
    }
    DirSearch(d);
   }
}
catch (System.Exception excpt) 
{
    Console.WriteLine(excpt.Message);
}
}

Ответы [ 2 ]

1 голос
/ 16 августа 2011

Вам следует позвонить Directory.EnumerateFiles(sDir, SearchOption.AllDirectories)

0 голосов
/ 16 августа 2011

Общий подход обрисован в общих чертах @Slaks - так как вам нужно поддерживать набор различных расширений файлов, и вы хотите получать статистику, возможно, было бы лучше написать собственный метод, так что вам нужно только пройтись по дереву каталоговодин раз.

Вместо использования рекурсивных вызовов вы можете просто использовать Stack для выражения рекурсии, ниже только пример, который возвращает список подходящих файлов на основе перечисления расширений - вы можете легко изменить это для своего сценария:

public static List<string> DirSearch(string startDirectory, IEnumerable<string> extensions)
{
    Stack<string> directoryStack = new Stack<string>();
    List<string> files = new List<string>();

    directoryStack.Push(startDirectory);
    while (directoryStack.Count > 0)
    {
        string currentDirectory = directoryStack.Pop();
        DirectoryInfo di = new DirectoryInfo(currentDirectory);
        files.AddRange(di.EnumerateFiles()
                         .Where(f => extensions.Contains(f.Extension))
                         .Select(f => f.FullName));
        foreach (string directory in Directory.GetDirectories(currentDirectory))
            directoryStack.Push(directory);
    }
    return files;
}
...