当文件中有数据时,磁盘上的文件大小如何为 0 字节?

Cod*_*r88 116 ntfs

我在 Windows 10 中有一个包含 362 字节数据的文件,但“磁盘大小”仅为 0 字节。这是一个用汇编编写的简单“Hello world”程序,并保存在Notepad++ 中

当文件大小为 362 字节时,磁盘上的大小怎么可能为零?

我有一个SSD,不是普通硬盘。

“属性”对话框的屏幕截图:

“属性”对话框的屏幕截图

Ben*_*n N 169

如果文件太小以至于其内容和文件系统簿记都在 1KB 内,就会发生这种情况。为了节省磁盘空间,NTFS 使小文件“常驻”,将它们的内容直接存储在文件记录中,因此不必为其分配簇。因此,磁盘上的大小为零,因为除了文件记录之外没有任何内容。一旦文件变得足够大,NTFS 会使其“非驻留”,为其分配一个或多个簇(创建一个非零的“磁盘大小”),并在文件记录中创建一个“映射对”来代替数据指向集群。

SSD 硬盘驱动器或 Windows 10 不影响此;它只是一个 NTFS 功能。进一步阅读:NTFS 文件增长的四个阶段

请注意,“磁盘大小”指标并不完全正确。例如,它从不包括 NTFS 文件记录占用的常量 1KB。该指标是在 Windows 95 中引入的,它没有使用 NTFS,因此无法解释这种现象;它只是显示文件大小四舍五入到集群大小的下一个倍数。尽管 Windows 7 之间的许多 Windows 版本都使用 NTFS 和常驻存储,但该估计算法一直沿用到 Windows 7。它最终在 Windows 8 中进行了更新,以将仅包含常驻数据的文件计算为磁盘上的零大小。进一步阅读:什么是“磁盘大小”?

  • 但是等等......我无法在我的 NTFS 卷(Windows 7)上复制 OP 行为。不管我如何创建小文件(有些只有一个字节长),根据文件属性对话框,它们每个都占用 *4KB*“磁盘空间”。唔... (8认同)
  • @misha256 嗯,我可以在 Windows 8.1 上用大约 700 字节以下的文件重现它。我的猜测是该算法在 Windows 7 和 8.1 之间变得更智能,因为最初它不知道任何花哨的 NTFS 东西([来源](https://technet.microsoft.com/en-us/magazine/hh148159 .aspx))。请注意,一旦文件进入第二阶段,它就永远不会缩小。 (8认同)
  • @Philipp 我想人们可以以任何一种方式争论。传统上,“磁盘上的文件”是“分配的簇的大小”(例如,您可以看到选择过大簇大小的影响)。据我所知,它从未包括文件系统所需的“目录”空间(例如“目录条目”的大小或“FAT 条目链的长度”)。 (6认同)
  • @Philipp:无论如何,将簿记包括在文件大小中会很快变得毛茸茸的:您如何描述具有 3 个名称的 1-cluster 文件? (3认同)
  • 有一瞬间,我以为我们正在研究重复数据删除的效果(http://blog.fosketts.net/2012/01/03/microsoft-adds-data-deduplication-ntfs-windows-8/),但我相信该功能的工作原理对于“磁盘大小”等指标来说是透明的。 (2认同)
  • 这不仍然是对存储使用的误传吗?文件属性对话框中的“磁盘大小”不应该也计算每个文件的 NTFS 文件记录条目的大小吗? (2认同)
  • 我可以在 Windows 10 上用大约 500-600 字节的文件重现它,似乎没有固定的大小限制。 (2认同)
  • @VlastimilOvčáčík 是的,这取决于其他簿记有多大。 (这里的簿记可以包括安全描述符和ADS注释。)如果数据大小*加上*其他业务的大小小于1KB,则不会分配新的集群;如果数据会使记录太大,则分配一个簇。 (2认同)