在 Windows 中空文件和文件夹怎么会占用零字节呢?

在 Windows 中空文件和文件夹怎么会占用零字节呢?

我也问过Linux 的一个兄弟问题


在 Windows 中(我刚刚测试过):

  • 空文件夹的大小为 0 字节
  • 空文件的大小为 0 字节

但是,文件和文件夹显然有名称,必须存储在某个地方。

  • 它们大概存储在哪里?
  • 可用于存储这些数据的最大内存是否是预定义的数字,还是取决于磁盘中的可用空间?
  • 名称较短的空文件是否比名称较长的空文件占用更少的空间?(或者存储这些名称的数据结构对每个文件都有固定的字节数,也许用填充剩余的字节\0?)
  • 名称较短的空文件夹是否比名称较长的空文件夹占用的空间更少?
  • 一个名为的空文件夹foobar比一个名为的空文件占用的空间更少、相同或更多foobar
  • 处的空文件C:\empty.txt比 处的空文件占用的空间更少、相同或更多C:\long\nested\path\until\the\empty\file\is\reached\empty.txt

答案1

我也问过一个有关 Linux 的兄弟问题。

如果有区别的话,那不是 Windows 和 Linux 之间的区别(你真的会对 macOS、Solaris 等提出同样的问题吗?),而是实际的文件系统用于在磁盘上存储文件。

但是,虽然每个操作系统都有其首选的文件系统,但 Windows 上的 FAT32 仍然与 Linux 上的 FAT32 行为相同;Linux 上的 NTFS 与 Windows 上的 NTFS 工作方式相同;等等。同时,同一操作系统上的各种文件系统可能彼此行为截然不同 - Ext4 和 Btrfs(或 FAT32 和 NTFS)英里即使它们在同一个操作系统上,也会分开。

空文件的大小为 0 字节

在所有情况下,报告的文件大小为总是只是实际内容,而不是元数据。实际上,当今使用的所有文件系统都会将它们视为两个独立的东西——如果您认为文件由其名称和附加在一起的数据组成,不,通常情况并非如此。

文件的名称通常存储在其父目录中(这也允许硬链接,即一个文件有多个名称)。因此长文件名可能会使父目录看起来更大。

其余与文件相关的元数据可能位于名称附近,或者更常见于单独的区域(例如 inode 表)。

可用于存储这些数据的最大内存是否是预定义的数字,还是取决于磁盘中的可用空间?

情况各不相同。每种文件系统都有自己的限制 – 有些有固定的最大值,有些则限制为磁盘的一定百分比,等等。

例如,在 FAT 中,每个目录可以拥有特定数量的“目录条目”(MS-DOS 样式 8.3 文件名每个占用一个条目,但长文件名占用多个条目)。这不适用于 NTFS,尽管两者都在 Windows 上。

在 Ext2/Ext4 中,整个文件系统的“inode”数量有限(每个文件或目录一个),它以固定大小记录列表的形式存储这些记录,并且该区域始终设置为磁盘空间的固定百分比。Ext4 磁盘上 inode 用完的情况并不罕见。这不适用于 XFS 或 Btrfs,它们都使用动态数据结构(通常是 B 树),并且会根据需要增长。

名称较短的空文件夹是否比名称较长的空文件夹占用更少的空间?(或者存储这些名称的数据结构对每个文件都有固定的字节数,也许用 \0 填充剩余的字节?)

它会有所不同。对于某些(大多数?)文件系统,名称的长度是可变的。

对于其他一些文件系统,仅在特定阈值下才会发生。同样,FAT/exFAT 和 UFS 及其固定大小的目录槽就是例子 - 如果一个槽被占用,那么它就被占用了,无论它存储的是使用空字节填充的 1 字节文件名还是 16 字节文件名。

一个名为 foobar 的空文件夹比一个名为 foobar 的空文件占用的空间更少、相同还是更多?

再次强调,这取决于文件系统。

如果我理解正确的话,在 FAT 中它们应该是相同的。在 NTFS 中我有点怀疑文件夹会更大,但目前我只是猜测。

C:\empty.txt 处的空文件比 C:\long\nested\path\until\the\empty\file\is\reached\empty.txt 处的空文件占用的空间更少、相同还是更多?

文件本身,总是相同的,因为文件不知道它的完整路径——操作系统通过向下查找父目录来找到它。这可能适用于所有文件系统。

但是这些文件夹会占用一些非零空间。

相关内容