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

评论

该文件名不计入文件中,该文件名如何解释。

我想起了一个大学时代的朋友,他写了一个软件来存储文本作为文件名来绕过磁盘配额。

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

@slebetman这是天才与精神错乱之间的界限变得模糊的地方。

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

#1 楼

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

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

评论


...也称为硬链接。

–丹尼尔B
15年9月15日在8:35

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

– David Schwartz
2015年9月15日在8:38



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

– David Schwartz
2015年9月15日上午9:10

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

–约翰·雷尼(John Rennie)
2015年9月16日下午5:53

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

– Peter Cordes
2015年9月16日在22:59



#2 楼

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

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

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

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

评论


“在包含文件的目录的inode中”您不是在指目录的数据,而不是目录的inode吗?索引节点包含文件大小和日期,但没有名称...

–麦迪诺克
15年9月16日在13:49

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

–Cort Ammon
2015年9月16日14:37在

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

– Phizes
2015年9月17日在8:02

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

–nekomatic
2015年9月17日在9:09

#3 楼

文件名存储在其他位置。

您的磁盘上将有一个“文件系统”,只需简单地选择一种方法即可选择如何在物理磁盘上表示和解释文件名和文件。 />
在大多数Windows磁盘上,您将使用称为“ NTFS”(新技术文件系统)的文件系统,该文件系统将文件名信息与文件内容分开存储在主文件表(MFT)中。主文件表上的相关文章。

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

评论


对于NTFS,Windows和大多数工具报告的文件大小实际上就是文件主流的大小,我们将其视为文件的内容。 NTFS分区上存储的文件可以另外将一些数据存储在备用数据流中,并且报告的大小仍然为0。这是一个很好的文件系统功能,可以知道是否要显示完整图片:)

–PawełBulwan
2015年9月16日于10:32

#4 楼

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

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

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

#5 楼

(答案有点晚了...)

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

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

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

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


名称= My_File.txt开始数据阻止=不适用
其他信息(所有者,权限,创建/更新/修改的日期)等

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

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

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

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

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

pps:图书馆内放错一本书的书意味着搜索图书馆,或用计算机术语:chkdsk或修复盘!

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

#6 楼

我们在这里有一些很好的答案-我只想添加图片版本(一千个单词之类的所有内容。)
如果用磁盘碎片整理对其进行可视化,这就是我的NTFS格式的硬盘的外观工具。 MFT(主文件表)以紫色显示:粗略地说,对于NTFS磁盘,目录是指一本书。而不是页面,它指向磁盘其余磁盘上的物理位置。
零字节大小的文件可以可视化为一个目录条目,该目录条目根本不指向任何页面:

条目已列出,但是-由于未显示任何页面,因此我们可以假定内容不存在。
1-当然,它要复杂一些;但是诸如扇区图,镜像MFT等点不在此问题的范围之内。

#7 楼

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

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

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

#8 楼

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

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

#9 楼

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

评论


这实际上是评论,而不是答案,仅是重复别人的话。

–Giacomo1968
2015年9月23日19:15在

#10 楼

因此它是这样工作的:

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

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


有关NTFS文件增长的更多信息。
有关NTFS MetaFiles的更多信息。