文件大小怎么会为零?

文件大小怎么会为零?

这是我遇到的问题,但想不出合适的解释。如果我在 PC 上创建一个空的 *.txt 文件,然后查看其大小,它会显示 0。但这怎么可能呢?我的意思是,即使文件本身是空的,它仍然必须有一定的大小,才能存储自己的名称。这怎么解释呢?(与操作系统无关)

答案1

这是可能的,因为实际上没有文件。只有一个具有名称和所有者的目录条目。目录条目在逻辑上与文件不同。例如,同一个文件可以在多个目录中拥有多个名称。

不幸的是,“文件”一词并不总是用来表示完全相同的意思。但文件大小逻辑来自这样的模型:目录条目将文件“附加”到目录,文件名和相关元数据存储在目录中。

答案2

“文件大小”的语义与您使用的不同。

有许多文件大小是有意义的。最常见的,也是您在这里看到的,是“文件中的字节数”。如果文件是一个空文本文件,它可能确实包含 0 个字节。这个数字对程序员来说很重要,因为我们经常需要打开一个文件,“读取所有数据”,然后关闭它。我们需要知道文件中有多少字节的数据,这样我们就可以提前计划。

另一个含义来自大多数文件系统存储数据的方式。大多数文件系统以块的形式存储数据。例如,文件系统可能以 64kB 的块的形式存储数据,这意味着它永远不会分配任何不是 64kB 偶数倍的数据。这听起来效率不高,但它可以使簿记变得简单得多,而且通常更简单意味着更快。

第三个含义,也就是您所关心的,是硬盘上描述文件存在所需的实际位数。这包括通常与文件分开存储的信息。例如,在 Linux 中,“文件名”的概念存储在包含文件的目录的 inode 中(编辑:从评论来看,从技术上讲,这是存储在目录的数据中。当我写这篇文章时,我在考虑小目录的情况。小于 156 字节的数据可以直接存储在 inode 中)。这不是一个常用的含义,因为如果不了解文件系统的深层内部工作原理,就很难确定(您是否考虑了存储文件所有权限所需的空间?)。但是,如果您有一个 1,000,000 字节的硬盘,并且想知道该硬盘上可以容纳多大的文件,那么这对您来说将是一个非常重要的含义!

答案3

文件名存储在其他地方。

您的磁盘上将有一个“文件系统”,简单地说是一种选择如何在物理磁盘上表示和解释文件名和文件的方法。

在大多数 Windows 磁盘上,您将使用名为“NTFS”(新技术文件系统)的文件系统,它将文件名信息存储在与文件内容分开的主文件表 (MFT) 中。请参阅维基百科关于主文件表的文章

因此,文件本身的长度为 0 字节,但其在 MFT 中的条目仍将占用一些空间。

答案4

(回答的有点晚了...)

文件大小如何为零比上述答案要复杂一些。这个问题被标记为 Win7,但看看其他“更简单”的文件系统,例如胖的或者NTFS,由于概念相似,可能会有用。

磁盘“不知道”什么是文件,什么是目录;所有数据都存储在小块中。操作系统会区分数据块的含义。前几个块很特殊,但其余块要么保存有关数据的信息(例如:文件名、文件长度、保存数据的第一个数据块),要么保存数据本身。

目录是一种特殊的“文件”,其“数据”在操作系统中被理解为包含文件信息的信息块,而不是文件的内容。一个很好的类比是物理图书馆和卡片目录。将信息块视为卡片目录,将书架视为数据块(卡片目录也位于类似书架的结构上)。

当您“创建”一个文件(例如使用 UNIXtouch命令)时,操作系统首先在信息块(目录)中创建一个条目,内容如下:

  • 名称 = My_File.txt
  • 长度 = 0
  • 起始数据块 = N/A
  • 附加信息(所有者、权限、创建/更新/修改日期)等

只有当有一些数据要“写入”时,它才会尝试找到一个空数据块来存储数据。但数据块的大小是固定的(比如 32K),方便磁盘访问和操作系统读取。如果您只写入“Hello”,则块的大部分都是“空的”(实际上可能不是零,而是之前存在的垃圾),因此表现在也会将大小更新为长度(比如 5 个字符 + 文件末尾),这样您就不会得到坏东西。

当您将“文件”更新为长度>块大小时,操作系统会将数据写入新块并更新数据块,以表明文件在第一个块之后继续到下一个块(依此类推),并且长度更新为新长度(细节不同)。

您最终得到的是信息数据块(目录或列表)的集合,其中包含有关数据块链(文件内容)的信息。

从逻辑上讲,这也解释了为什么在同一个文件系统上文件移动速度很快,而复制却需要很长时间。操作系统只需编辑 2 个目录块即可从一个目录(信息数据块)中删除条目并添加到另一个目录。删除文件:只需删除目录块中的条目,释放要重新分配的文件数据块。

附言:仅仅因为卡片目录中有一本书的条目并不意味着它在书架上(可能已借出或丢失);文件大小为 0。

pps:图书馆里放错的书意味着搜索图书馆,或者用计算机术语来说:chkdsk 或修复磁盘!

通过阅读有关 UNIX inode 或了解版本控制系统(ClearCase、TFS、Git 等)如何管理文件和目录,以及文件版本甚至目录版本,可以获得更深入的理解。在大多数情况下,所有内容都存储在数据库中,并以经典的目录结构和文件形式呈现给用户!

相关内容