C#中按类型的总大小和文件数

时间:2011-08-16 01:00:45

标签: c# recursion hashtable filesize

我是一名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 个答案:

答案 0 :(得分:1)

您应该致电Directory.EnumerateFiles(sDir, SearchOption.AllDirectories)

答案 1 :(得分:0)

@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;
}