我用C#/.NET编写了以下 routine 来手动遍历目录并计算其大小:


protected static float CalculateFolderSize(string folder)
{
    float folderSize = 0.0f;
    try
    {
        //Checks if the path is valid or not
        if (!Directory.Exists(folder))
            return folderSize;
        else
        {
            try
            {
                foreach (string file in Directory.GetFiles(folder))
                {
                    if (File.Exists(file))
                    {
                        FileInfo finfo = new FileInfo(file);
                        folderSize += finfo.Length;
                    }
                }

                foreach (string dir in Directory.GetDirectories(folder))
                    folderSize += CalculateFolderSize(dir);
            }
            catch (NotSupportedException e)
            {
                Console.WriteLine("Unable to calculate folder size: {0}", e.Message);
            }
        }
    }
    catch (UnauthorizedAccessException e)
    {
        Console.WriteLine("Unable to calculate folder size: {0}", e.Message);
    }
    return folderSize;
}

我有一个应用程序,它为大量文件夹重复运行此 routine .我想知道用.NET计算文件夹大小有没有更有效的方法?我在框架中没有看到任何具体的东西.我应该使用P/Invoke和Win32API吗?在.NET中计算文件夹大小的最有效方法是什么?

推荐答案

我不相信有一个Win32 API来计算一个目录所消耗的空间,尽管我会在这方面得到纠正.如果有的话,我想探险家会使用它.如果您在资源管理器中获得了一个大目录的属性,那么获得文件夹大小所需的时间与它包含的文件/子目录的数量成正比.

你的日常生活似乎相当整洁;易于理解的请记住,您计算的是文件长度之和,而不是磁盘上消耗的实际空间.群集、文件流等末尾浪费的空间所消耗的空间被忽略.

.net相关问答推荐

为什么Regex.Escape支持数字符号和空格?

如何知道变量是否只是指向另一个对象的pointer或者它是否可以独立存在

代码访问安全是否在任何现实世界中使用?

将字符串与容差进行比较

无法解析此引用.找不到程序集

如何在 MSBuild 脚本中获取当前目录?

为什么 C# 不允许像 C++ 这样的非成员函数

如何解决请确保文件可访问并且它是有效的程序集或 COM 组件?

ASP.NET MVC:隐藏字段值不会使用 HtmlHelper.Hidden 呈现

如何让 DateTimePicker 显示一个空字符串?

有没有办法以编程方式最小化窗口

File.ReadAllLines() 和 File.ReadAllText() 有什么区别?

.NET 等价于旧的 vb left(string, length) 函数

如何等到远程 .NET 调试器附加

NuGetPackageImportStamp 有什么用?

Iif 在 C# 中等效

如何找到二维数组的大小?

根据条件从列表中删除项目

ConfigurationManager.AppSettings - 如何修改和保存?

如何从 webclient 获取状态码?