文件大小如何为零?


173

只是我遇到的事情,想不出适当的解释。如果我在PC上创建一个空的* .txt文件,然后查看其大小,则显示为0。但这怎么可能?我的意思是,即使文件本身为空,它也必须具有一定的大小,以便存储自己的名称。如何解释呢?(非特定于操作系统)


81
文件名不计入文件,即如何解释。
njzk2

123
我想起了一个大学时代的朋友,他写了一个软件来存储文本作为文件名来解决磁盘配额问题。
slebetman

15
@ColeJohnson我是U的一个计算机实验室中的2000年实习生,并且用户配额是根据文件大小之和计算得出的。因此,将数据存储为文件名确实可以解决qouta的问题。哎呀,您可以将程序保存在文件夹中,并且不会计入您的配额。
Mindwin

20
@slebetman这是天才与精神错乱之间的界线变得模糊的地方。
法拉普

10
压缩挑战中使用了类似的技术,
Oddthinking

Answers:


202

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

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


30
...也称为硬链接。
丹尼尔·B

6
在目录中。否则,如果同一文件位于两个目录中,并且您在一个目录中重命名了文件名,则将修改另一个目录,这根本没有意义。另外,不是这样,目录的内容是什么?
David Schwartz

14
在大多数类似UNIX的OS(例如FreeBSD和Linux)上,您可以轻松获取目录的大小。这样的命令ls -ld <directory>将起作用。
David Schwartz 2015年

11
我不知道这是否适用于当前版本的NTFS,但是早期版本(例如,在NT3.x上)会将非常小的文件的数据存储在目录条目中。该文件实际上不存在。
约翰·雷尼

13
除非NTFS与其他文件系统有很大不同,否则没有文件是不正确的。在普通的Unix文件系统上,会有一个存储权限,修改时间等的索引节点。目录条目仍然引用此索引节点。空文件和非空文件之间的唯一区别是分配块的指针。但是,空文件的块映射的文件系统等效于NULL指针,以指示它没有任何数据块。目录条目不会杂乱无章的权限和修改时间,即使是空文件也是如此。例如,XFS索引节点为256B
Peter Cordes

82

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

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

大多数文件系统存储数据的方式也产生了另一种含义。大多数文件系统将数据存储在块中。例如,文件系统可能以64kB块存储数据,这意味着它将永远不会分配不是64kB偶数倍的任何内容。这听起来效率低下,但可以使簿记变得非常简单,并且通常更简单的方法意味着更快。

您要提到的第三个含义是硬盘驱动器上描述文件存在所需的实际位数。这包括通常与文件分开存储的信息。例如,在Linux中,“文件名”的概念存储在包含文件的目录的inode中(编辑:从注释开始,从技术上讲,这存储在目录的数据中。当我写此文件时,我想到的是目录的情况。小于156字节的数据可以直接存储在inode中。这不是常用的含义,因为在不知道文件系统的深入内部工作的情况下很难确定(您是否考虑了存储文件上所有权限所需的空间?)。但是,如果您有一个1,000,000字节的硬盘驱动器,


2
“在包含文件的目录的inode中”您不是在说目录的数据,而不是目录的inode吗?
索引

@Medinoc好点。当它在inode内存储数据时,我想到的是内联情况,但实际上我没有检查是否可能发生这种情况!我添加了一个编辑。
Cort Ammon 2015年

ext4的相关内联数据功能,这决不是在所有文件系统中通用的。此外,这适用于文件索引节点,而不适用于目录。它们是独立的,目录也具有内联数据功能,但是它们是独立的功能。至少在ext4的情况下,文件inode具有设置的大小,因此权限的数据使用无关紧要。文件磁盘的使用在很大程度上取决于所使用的文件系统,据我所知,此答案的第三部分仅适用于ext4,这一点尚不清楚。
Phize

8
如果您有一个1,000,000字节的硬盘驱动器,那么也许是时候开始考虑升级了。
nekomatic

53

文件名存储在其他位置。

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

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

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


11
对于NTFS,Windows和大多数工具报告的文件大小实际上就是文件主流的大小,我们将其视为文件的内容。NTFS分区上存储的文件可以另外将一些数据存储在备用数据流中,并且报告的大小仍为0。这是一个不错的文件系统功能,要知道,如果你想拥有完整的图片:)
帕维尔Bulwan

12

这是一个很有趣的本体论问题。

文件本身就是文件的内容。如果文件没有内容,则文件大小为零。文件名是文件的一部分,而您自己的名字实际上是您的一部分(即不是)。

正如您的名字在人们(和您自己的)头脑中存在的想法一样,它指向/指向您的身体,文件名也存在于文件系统的目录树中,并且它指向/指向该文件。


7

(答案有点晚了...)

如何将文件的大小设为零比上述答案提供的要复杂一些。这个问题被标记为Win7,但是查看其他“更简单”的文件系统,例如FATNTFS,可能会很有用,因为概念很相似。

磁盘不“知道”什么是文件和什么是目录;小块中的所有数据。OS区分数据块的含义。前几个是特殊的,但是其余的块保存有关数据的信息(例如:文件名,文件长度,保存数据的第一个数据块)或数据本身。

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

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

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

仅当有一些数据要“写入”时,它才会尝试找到一个空的数据块来存储数据。但是数据块具有固定大小(例如32K),方便磁盘访问和OS读取。如果您只写“ Hello”,则大多数块为“空”(实际上可能不是零,而是以前的值是垃圾),因此表现在还将大小更新为长度(例如5个字符+ End of文件),这样您就不会弄坏东西。

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

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

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

ps:仅仅因为卡片目录中有某本书的条目,并不意味着它就已经搁置了(也许已签出或丢失);文件大小为0。

pps:库中放错地方的书意味着搜索库,或用计算机术语表示:chkdsk或修复盘!

通过阅读有关UNIX索引节点或了解版本控制系统(ClearCase,TFS,Git等)如何不仅管理文件和目录,而且还管理文件的版本甚至目录的版本,可以加深了解。在大多数情况下,所有内容都存储在数据库中,并呈现给用户以显示为经典目录结构和文件!


4

我们在这里有一些很好的答案-我只想添加图片版本(一千个单词之类的东西)。

如果使用磁盘碎片整理工具将其可视化,这就是我的NTFS格式的硬盘之一。的MFT(主文件表)示于紫:

在此处输入图片说明

紫罗兰色的小方块描述了HD中存在的文件列表。粗略地说,对于NTFS磁盘,目录是指一本书。而不是页面,它指向磁盘1其余部分上的物理位置。

大小为零字节的文件可以可视化为“目录”条目,该目录指向根本没有页面:

在此处输入图片说明

该条目已列出,并已列出-但由于未显示任何页面,因此我们可以假定该内容不存在。

1-当然,这要复杂一些;但是诸如扇区图,镜像MFT等点不在此问题的范围内。


3

文件系统存储有关文件的大量信息,例如文件名,文件大小,创建时间,访问时间,修改时间,创建的用户,用户和组权限,片段,指向存储文件的群集的指针,硬/软链接,属性...这些被称为文件元数据。当用户不(不需要)关心它们并且不知道它们时,为什么将这些元数据计入文件大小?他们只在乎文件内容

此外,每个文件系统存储不同类型的元数据,这些元数据在磁盘上占用不同的空间量。例如,POSIX权限与NTFS权限有很大的不同,并且inodePOSIX 中也有一些数字在Windows中不存在。甚至POSIX文件系统也相差很大,例如具有32位块地址的ext3,具有48位地址的ext4,具有64位地址的Btrfs和具有128位地址的ZFS。那么如何将这些元数据计入文件大小?

再以一个100字节的文件为例,该文件的元数据在当前文件系统上消耗56字节。我们将文件复制到另一个文件系统,现在它需要128个字节的元数据。但是文件内容完全相同文件中的字节数也相同。因此,在一个系统上将文件大小显示为156字节,在另一个系统上显示为228字节,这非常令人困惑和违反直觉


1

文件大小为0,类似于说:我的纸上有5文字。在另一张纸上,上面有0文字。因此0完全有可能。

文件的元数据(创建日期时间,上次修改日期时间,文件所有者,权限)都存储在其他位置,并且不作为文件大小的一部分包括在内。


0

以一种简单的方式理解它...创建文件时..将生成一个目录条目,该目录条目用作由您提供的文件名标识的文件存储位置的指针。当您创建越来越多的指针或说文件时,目录的大小会增加。而仅当您将一些数据放在指定的位置即文件本身内部时,文件的大小才会增加。到那时,大小将为零。:)


这实际上是一个评论,而不是答案,只是重复了别人所说的话。
JakeGould 2015年

0

因此,它是这样工作的:

一旦在卷上创建任何文件,它就会在NTFS mata文件(即$ MFT(主文件表))中创建一个文件记录。由于MFT中存在FRS(文件记录段),因此您将看到一条记录。对于NTFS文件系统,每个文件记录的大小默认为1 KB。但是只有在文件中存储一些信息时,才会占用该空间。即使您只考虑一个文本文件而只写一个字母“ a”,它也会占用1 KB的空间,因为这是FRS的默认大小。字母“ a”转到该FRS的默认和未命名数据流$ Data,这是一个属性,如果您没有ADS(备用数据流),则所有数据将流向该属性。

如果您有任何疑问,请告诉我。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.