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

C# C中按类型划分的文件的总大小和数量#,c#,recursion,hashtable,filesize,C#,Recursion,Hashtable,Filesize,我是Java老手,但对.NET还不熟悉。我需要按类型收集文件的总大小和数量,并以C#为单位收集总计。有比递归搜索更好的方法吗?此外,我需要找到多种类型。哈希表是否适合与我的扩展和更新一起加载 void DirSearch(string sDir) { try { foreach (string d in Directory.GetDirectories(sDir)) { FileInfo[] fiArr = d.GetFiles(); foreach (stri

我是Java老手,但对.NET还不熟悉。我需要按类型收集文件的总大小和数量,并以C#为单位收集总计。有比递归搜索更好的方法吗?此外,我需要找到多种类型。哈希表是否适合与我的扩展和更新一起加载

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

您应该调用
Directory.EnumerateFiles(sDir,SearchOption.AllDirectories)
您应该调用
Directory.EnumerateFiles(sDir,SearchOption.AllDirectories)

@Slaks概述了一般方法-因为您确实需要支持一组不同的文件扩展名,并且希望获得统计信息,所以最好编写一个自定义方法,这样您只需遍历目录树一次

不使用递归调用,您只需使用堆栈来表示递归,下面是一个基于扩展名枚举返回匹配文件列表的示例,您可以根据您的场景轻松修改此示例:

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;
}
publicstaticlist目录搜索(stringstartdirectory,IEnumerable扩展名)
{
Stack directoryStack=新堆栈();
列表文件=新列表();
directoryStack.Push(startDirectory);
而(directoryStack.Count>0)
{
字符串currentDirectory=directoryStack.Pop();
DirectoryInfo di=新的DirectoryInfo(currentDirectory);
files.AddRange(di.EnumerateFiles()
.Where(f=>extensions.Contains(f.Extension))
.选择(f=>f.FullName));
foreach(directory.GetDirectories(currentDirectory)中的字符串目录)
Push(目录);
}
归还文件;
}

@Slaks概述了一般方法-由于您确实需要支持一组不同的文件扩展名,并且希望获得统计信息,因此最好编写一个自定义方法,这样您只需遍历目录树一次

不使用递归调用,您只需使用堆栈来表示递归,下面是一个基于扩展名枚举返回匹配文件列表的示例,您可以根据您的场景轻松修改此示例:

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;
}
publicstaticlist目录搜索(stringstartdirectory,IEnumerable扩展名)
{
Stack directoryStack=新堆栈();
列表文件=新列表();
directoryStack.Push(startDirectory);
而(directoryStack.Count>0)
{
字符串currentDirectory=directoryStack.Pop();
DirectoryInfo di=新的DirectoryInfo(currentDirectory);
files.AddRange(di.EnumerateFiles()
.Where(f=>extensions.Contains(f.Extension))
.选择(f=>f.FullName));
foreach(directory.GetDirectories(currentDirectory)中的字符串目录)
Push(目录);
}
归还文件;
}

您所说的“更好”到底是什么意思?您所说的“更好”到底是什么意思?看起来它不支持多个过滤器。然后我会为我的每个扩展运行这个吗?看起来它不支持多个过滤器。然后我会为我的每个扩展运行这个吗?对任何看到这个的人来说都很重要:f.扩展返回包含点的扩展。我的生命只有30分钟。你可以使用
SearchOption.AllDirectories
重要提示:f.扩展返回包含点的扩展名。我的生命只有30分钟。你可以使用
SearchOption.AllDirectories