【问题标题】:File size - actual number of bytes used on disk (not allocated) [duplicate]文件大小 - 磁盘上使用的实际字节数(未分配)[重复]
【发布时间】:2012-12-19 18:58:33
【问题描述】:

可能重复:
Get Size of file on disk

有没有办法使用 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 操作系统的限制?

【问题讨论】:

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

标签: windows file winapi c#-4.0 filesize


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2010-10-07
        • 2015-05-05
        • 1970-01-01
        • 2018-01-09
        • 1970-01-01
        • 2021-10-06
        • 2020-10-17
        • 2011-04-14
        相关资源
        最近更新 更多