【发布时间】:2012-12-19 18:58:33
【问题描述】:
有没有办法使用 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 操作系统的限制?
【问题讨论】:
-
这取决于操作系统 - 请参阅 stackoverflow.com/questions/3750590/get-size-of-file-on-disk
-
@ehambright - 我只发布了一个问题,因为我没有在网上找到其他解决方案。我已经多次遇到上述帖子,并且在我的问题中没有任何我没有尝试或没有提到的内容(除了使用 WMI 来返回集群大小这无济于事,因为它仍然存在回到使用 GetCompressedFileSize)。很抱歉直言不讳,Windows 变得非常令人沮丧! ;-)
-
我不明白您为什么要谈论监视文件夹、独占模式等。这与文件大小有什么关系?
-
您能详细说明“磁盘上使用的字节数”和“文件大小”之间的区别吗?
GetCompressedFileSize告诉您文件消耗的硬盘驱动器上的物理位数(压缩后和删除稀疏扇区后)。根据您的描述,听起来您想要“实际写入文件的最高字节的偏移量”。没有办法获得该值。 -
@RaymondChen:磁盘分为固定大小的扇区和簇。一个文件占用了这么多扇区。如果文件的末尾只填满了一个扇区的一部分,整个扇区仍然被分配。如果该扇区仅填充了集群的一部分,则仍会分配整个集群。所以“使用的字节数”可以大于“文件大小”。要获得“使用的字节数”,您必须将“文件大小”四舍五入到下一个集群边界。您必须询问文件系统其扇区和簇大小是多少,例如通过
GetDiskFreeSpace(),因为它们是在首次创建文件系统时动态设置的。
标签: windows file winapi c#-4.0 filesize