2

可能重复:
获取磁盘上文件的大小

有没有办法使用 C# / windows 来检索磁盘上特定文件使用的实际字节数?

我的应用程序实现了“监视”文件夹,类似于 FileSystemWatcher。一些监视文件夹存在于共享存储(网络和光纤通道 SAN)上,另一些存在于本地连接的存储上。

文件被完全不受我控制的进程复制到监视文件夹中,大小从 1 GB 到 > 500 GB 不等。由于共享文件系统的性质,希望在“独占”打开文件(FileMode.Open、FileAccess.Read、FileShare.None)时出现异常也不起作用。

在文件完全复制/关闭之前,这些监视文件夹不应该采取行动 - 否则下游可能会出现问题。

为了获得磁盘上使用的“真实”文件大小,我尝试过:

  • System.IO.FileInfo
  • GetFileSizeEx (kernel32 p/invoke)
  • FindFirstFileEx (kernel32 p/invoke)
  • GetCompressedFileSize & GetDiskFreeSpace (kernel32 p/invoke)

任何建议将不胜感激。好像我正在处理 Windows 操作系统的限制?

4

3 回答 3

2

没有 API 可以获取文件的“磁盘大小”,您必须根据您对磁盘几何形状的了解自行计算。

于 2012-12-19T21:03:42.820 回答
1

总而言之,这里的问题是其他应用程序通过创建目标来复制文件,然后使用SetFileSize将文件大小设置为最终大小(比如说 1GB),本质上是创建一个完全用零填充的 1GB 文件。

然后应用程序返回文件的开头并开始用数据顺序填充它。目标是确定其他应用程序已达到“用数据填充”的哪个点。

不幸的答案是没有办法获得这些信息。就文件系统而言,文件存在且大小为1GB。碰巧文件正在被主动更新而不改变大小,但是这些内部更改没有在文件元数据中进行审核。文件的各个字节没有“最后修改时间”。

If you have domain-specific knowledge of the files (e.g. you know that the last byte is never zero) you can poll the last byte of the file and back off if it is zero.

于 2012-12-19T23:16:46.057 回答
0

使用GetDiskFreeSpace您可以获得足够的信息来计算集群大小。四舍五入到这个值以获得磁盘上的实际大小,或者它的一个很好的近似值。

于 2012-12-19T22:38:45.027 回答