如何在C#中获取目录大小(目录中的文件)?

Llo*_*ell 15 .net c# asp.net winforms

我希望能够使用C#获取其中一个本地目录的大小.我试图避免以下(伪代码),虽然在最坏的情况下我将不得不满足于此:

    int GetSize(Directory)
    {
        int Size = 0;

        foreach ( File in Directory )
        {
            FileInfo fInfo of File;
            Size += fInfo.Size;
        }

        foreach ( SubDirectory in Directory )
        {
            Size += GetSize(SubDirectory);
        }
        return Size;
    }
Run Code Online (Sandbox Code Playgroud)

基本上,是否有可以在某处使用Walk()以便我可以遍历目录树?这将保存通过每个子目录的递归.

Kev*_*Kev 34

在.net 4.0中获取文件夹大小的一种非常简洁的方法如下.它仍然受到必须以递归方式遍历所有文件的限制,但它不会加载潜在的大量文件名,而且只有两行代码.

private static long GetDirectorySize(string folderPath)
{
    DirectoryInfo di = new DirectoryInfo(folderPath);
    return di.EnumerateFiles("*.*", SearchOption.AllDirectories).Sum(fi => fi.Length);
}
Run Code Online (Sandbox Code Playgroud)

  • 我建议你使用*而不是*.*因为文件名不需要. (5认同)
  • 我按照你的推理Joe,但我认为这是不必要的,因为Windows操作系统将匹配*.*针对文件/文件夹名称的模式,无论它们是否包含'.' 或不.我认为这没什么区别,但有兴趣知道我是不是错了.当然,如果Mono在不同的操作系统上运行,那么它可能会有所不同. (5认同)
  • 很不错。除非您想在每个目录的基础上处理 UnauthorizedAccessException、PathTooLongException 等。 (2认同)

Mar*_*ell 19

如果你使用Directory.GetFiles你可以做一个递归搜索(使用SearchOption.AllDirectories),但这有点片状(特别是如果你没有访问其中一个子目录) - 并可能涉及一个巨大的单个阵列回来(警告klaxon ...).

我会对递归方法感到满意,除非我能够显示(通过分析)瓶颈; 然后我可能会切换到(单级)Directory.GetFiles,使用Queue<string>模拟递归.

请注意,.NET 4.0引入了一些基于枚举器的文件/目录列表方法,这些方法可以节省大数组.


fla*_*ayn 6

这是我的.NET 4.0方法

public static long GetFileSizeSumFromDirectory(string searchDirectory)
{
 var files = Directory.EnumerateFiles(searchDirectory);

 // get the sizeof all files in the current directory
 var currentSize = (from file in files let fileInfo = new FileInfo(file) select fileInfo.Length).Sum();

 var directories = Directory.EnumerateDirectories(searchDirectory);

 // get the size of all files in all subdirectories
 var subDirSize = (from directory in directories select GetFileSizeSumFromDirectory(directory)).Sum();

 return currentSize + subDirSize;
}
Run Code Online (Sandbox Code Playgroud)

甚至更好:

// get IEnumerable from all files in the current dir and all sub dirs
var files = Directory.EnumerateFiles(searchDirectory,"*",SearchOption.AllDirectories);

// get the size of all files
long sum = (from file in files let fileInfo = new FileInfo(file) select fileInfo .Length).Sum();
Run Code Online (Sandbox Code Playgroud)

正如Gabriel指出,如果您在searchDirectory下有一个受限制的目录,这将失败!