文件大小 - 磁盘上使用的实际字节数(未分配)

时间:2012-12-19 18:58:33

标签: windows file winapi c#-4.0 filesize

  

可能重复:
  Get Size of file on disk

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

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

文件被完全不受我控制的进程复制到监视文件夹中,大小从1 GB到> 1。 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操作系统的限制?

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

总结一下,这里的问题是其他应用程序通过创建目标来复制文件,然后使用SetFileSize将文件大小设置为最终大小(假设为1GB),实际上创建了1GB文件完全用零。

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

不幸的答案是没有办法获取这些信息。就文件系统而言,文件存在且其大小为1GB。它恰好在不改变大小的情况下主动更新文件,但是文件元数据中没有审计这些内部更改。文件的各个字节没有“上次修改时间”。

如果您具有特定于域的文件知识(例如,您知道最后一个字节永远不为零),您可以轮询文件的最后一个字节,如果它为零则退回。

答案 2 :(得分:0)

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