【问题标题】:How to get exact directory size on disk如何获取磁盘上的确切目录大小
【发布时间】:2023-04-04 10:00:01
【问题描述】:

我是使用 Windows 文件系统的新手,我已经被这个问题困扰了几天。我正在使用 C# 进行编码,我想要的是获得目录的确切“磁盘大小”,就像 Windows 7 上目录的“属性”对话框中显示的那样。

现在我可以得到一个粗略的数字,遍历目录中的每个文件和每个子目录,使用 API GetCompressedFileSize in kernel32.dll 压缩文件和 FileInfo.Length 属性四舍五入到集群的倍数普通文件的大小。

我发现有些文件共享簇(?)(磁盘上的大小不是簇大小的倍数)而其他文件分别占用簇,那么我无法获得磁盘上的确切大小,是否将大小四舍五入为倍数集群大小与否。

还有一些不占用磁盘空间的符号链接,我找不到将它们与普通目录区分开来的方法。我得到的尺寸比实际尺寸大得多,因为我无法避免计算这些链接的尺寸。

我想必须有一个 API 或其他东西来获取磁盘上的确切文件或目录大小。那是什么?还是有更简单/更快的方法来做到这一点?感谢您的帮助!

【问题讨论】:

  • 不是真正的答案,但这可能是……stackoverflow.com/questions/3750590/…
  • “磁盘大小”不是一个定义明确的概念,尤其是在文件可​​以包含非零数据但仍占用零簇的 NTFS 上。 Explorer 使用了一个非常幼稚的定义。
  • Explorer 甚至不会尝试您的要求

标签: c# .net windows pinvoke filesize


【解决方案1】:

这是一种更简洁的方式:-

private static long GetDirectorySize(string path)
{
    DirectoryInfo dir = new DirectoryInfo(path);
    return dir.EnumerateFiles("*.*", SearchOption.AllDirectories).Sum(file=> file.Length);
}

基本上,EnumerateFiles 返回一个FileInfo 的列表,我们使用它的Length 属性来计算目录的总文件大小。

虽然它仍然使用递归来获取目录大小,但它确实是一种更简洁的方法。

要使用 C# 获取磁盘上的大小,您必须深入挖掘,例如使用 GetDiskFreeSpace

另外,请查看以下msdn thread

希望这会有所帮助!

【讨论】:

  • 它更整洁,但似乎并没有解决我的问题。我需要的是“磁盘大小”。
  • 在发布这个问题之前,我已经查看了这两个网页。压缩文件有时可以共享集群,因此公式不合适,因此我几乎无法获得目录磁盘上的大小。此外,我还没有找到一种方法来区分普通文件/文件夹中的符号链接。我已经在使用GetDiskFreeSpace 来查找集群大小。以上都是我的想法和尝试。
猜你喜欢
  • 2020-08-02
  • 2021-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-06
  • 2011-04-14
  • 1970-01-01
  • 2018-12-04
相关资源
最近更新 更多