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

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

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

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

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

这些监视文件夹不应该采取行动,直到一个文件被完全复制/closures,否则下游会出现问题。

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

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

任何build议将非常感激。 看来我正在处理Windows操作系统的限制?

Solutions Collecting From Web of "文件大小 – 磁盘上使用的实际字节数(未分配)"

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

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

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

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

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

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