C# 计算目录大小

标签 c# windows-10 console-application

这里是 C# 菜鸟,我正在尝试执行一个应用程序来计算目录的大小。使用 this例如,我创建了以下方法:

public static long CalculateSize(DirectoryInfo dir, string search = "*.*")
{
    long result = 0;
    FileInfo[] files = null;
    DirectoryInfo[] subDirs = null;
    try
    {
        files = dir.GetFiles(search, SearchOption.TopDirectoryOnly);
    }

    catch (UnauthorizedAccessException)
    {
        //catch unauthorized exception
    }

    catch (PathTooLongException e)
    {
        Console.WriteLine("PATH: " + e.Message);
    }

    if (files != null)
    {
        foreach (var file in files)
        {
            result += file.Length;                    
        }

        subDirs = dir.GetDirectories(search, SearchOption.TopDirectoryOnly);
        foreach (var directory in subDirs)
        {
            result += CalculateSize(directory, search);
        }
    }
    return result;
}

虽然当我运行它时:

var dir = new DirectoryInfo("C:\\Users\\");
var size = FileSystem.CalculateSize(dir);
Console.WriteLine(size);

文件资源管理器向我展示了几乎两倍的大小: 我的结果 -> 33189002865 文件浏览器属性 -> 12263901898 我对此进行了测试,将“result += file.Length”替换为“result++”以获取该方法迭代的文件数,并且那里也有很大差异: 我的结果 -> 94476 文件解释 -> 59318

当我在我的另一个驱动器 (D:) 上测试它时,我得到的结果与文件资源管理器完全相同,无论我是否在我的根目录、里面的某个文件夹等上运行它。但是每当我在我的系统驱动器 (C :) - 得到这个奇怪的结果。我不知道我做错了什么,非常感谢您的帮助!

附言如果相关,我会在 Windows 10 Pro 64 位上运行我的测试。

最佳答案

这是文件资源管理器算法的问题,该算法对某些特定文件夹的大小或权限有影响。

路径的文件资源管理器:

C:\Users\All Users

不会显示尺寸等任何信息。

所以如果你要检查这个路径:

C:\Users\

它不会计算 "C:\Users\All Users" 的大小。但是您的脚本会计算它的大小。

获取文件夹大小的更好的 Windows 工具是 cmd 中的 DIR。

打开你的cmd,然后写下:

cd Users
dir /s /a

/s - 显示指定目录下的所有文件和文件夹

/a - 显示所有类型的文件和文件夹

(对不起波兰语)

C:\Users\(您的程序和 dir/s/a)的良好计算图片:

Picture of good calculations

什么显示 C:\Users\的文件资源管理器:

What shows file explorer

关于C# 计算目录大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49363965/

相关文章:

delphi - 如何为控制台窗口创建表单模式

c# - 在 XAML 中使用静态函数绑定(bind)

docker - 错误:无法连接到Docker守护程序。您可能需要启动Docker for Windows

c# - 如何让我的程序生成一个新的随机数,直到它找到一个以前没有使用过的随机数?

docker - 事件名称应至少由斜杠分隔的 3 个部分组成。 Asp.Net Core Docker 中的参数名称 eventName

vbscript 通过任务计划程序在 Windows 10 中打开 excel 文件

java - 在 Java 中创建类似屏幕的控制台的可能方法

delphi - writeln (“:width” 说明符的明显副作用会导致输出中出现问号)

c# - 为什么 int 数组的最大大小小于 Int32.MaxValue?

c# outlook 删除所有约会