如何在磁盘上获取确切的目录大小

时间:2014-02-02 04:35:13

标签: c# .net windows pinvoke filesize

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

现在,我可以使用GetCompressedFileSize中的API kernel32.dll遍历压缩文件中的FileInfo.Length并遍历{{1}}属性,从而遍历目录中的每个文件和每个子目录到普通文件的簇大小的倍数。

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

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

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

1 个答案:

答案 0 :(得分:8)

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

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

希望这有帮助!