只是我遇到的事情,想不出适当的解释。如果我在PC上创建一个空的* .txt文件,然后查看其大小,则显示为0。但这怎么可能?我的意思是,即使文件本身为空,它也必须具有一定的大小,以便存储自己的名称。如何解释呢?(非特定于操作系统)
只是我遇到的事情,想不出适当的解释。如果我在PC上创建一个空的* .txt文件,然后查看其大小,则显示为0。但这怎么可能?我的意思是,即使文件本身为空,它也必须具有一定的大小,以便存储自己的名称。如何解释呢?(非特定于操作系统)
Answers:
可能是因为确实没有文件。只有一个带有名称和所有者的目录条目。该目录条目在逻辑上与文件不同。例如,同一文件在多个目录中可以有多个名称。
不幸的是,“文件”一词并非总是用来表示同一件事。但是文件大小逻辑来自模型,其中目录条目将文件“附加”到目录,文件名和相关的元数据存储在目录中。
ls -ld <directory>
将起作用。
“文件大小”的语义含义与您所使用的含义不同。
有许多有意义的文件大小。您在这里看到的最常见的一个是“文件中的字节数”。如果该文件是一个空文本文件,则实际上可能包含0个字节。这个数字对程序员很重要,因为我们经常需要打开一个文件,“读取所有数据”,然后关闭它。我们需要知道文件中将有多少字节数据,以便我们可以提前计划。
大多数文件系统存储数据的方式也产生了另一种含义。大多数文件系统将数据存储在块中。例如,文件系统可能以64kB块存储数据,这意味着它将永远不会分配不是64kB偶数倍的任何内容。这听起来效率低下,但可以使簿记变得非常简单,并且通常更简单的方法意味着更快。
您要提到的第三个含义是硬盘驱动器上描述文件存在所需的实际位数。这包括通常与文件分开存储的信息。例如,在Linux中,“文件名”的概念存储在包含文件的目录的inode中(编辑:从注释开始,从技术上讲,这存储在目录的数据中。当我写此文件时,我想到的是目录的情况。小于156字节的数据可以直接存储在inode中。这不是常用的含义,因为在不知道文件系统的深入内部工作的情况下很难确定(您是否考虑了存储文件上所有权限所需的空间?)。但是,如果您有一个1,000,000字节的硬盘驱动器,
文件名存储在其他位置。
您的磁盘上将有一个“文件系统”,只需简单地选择一种方法即可选择如何在物理磁盘上表示和解释文件名和文件。
在大多数Windows磁盘上,您将使用一个名为“ NTFS”(新技术文件系统)的文件系统,该文件系统将文件名信息存储在主文件表(MFT)中,与文件内容分开。请参阅主文件表上的Wikipedia文章。
因此,文件本身的长度为0个字节,但它在MFT中的条目仍会占用一些空间。
(答案有点晚了...)
如何将文件的大小设为零比上述答案提供的要复杂一些。这个问题被标记为Win7,但是查看其他“更简单”的文件系统,例如FAT或NTFS,可能会很有用,因为概念很相似。
磁盘不“知道”什么是文件和什么是目录;小块中的所有数据。OS区分数据块的含义。前几个是特殊的,但是其余的块保存有关数据的信息(例如:文件名,文件长度,保存数据的第一个数据块)或数据本身。
目录是一个特殊的“文件”,操作系统将其理解为“数据”,它是一个信息块,其中包含有关文件的信息,而不是文件的内容。一个很好的类比是物理库和卡目录。将信息块视为卡目录,将架子视为数据块(卡目录也位于类似架子的结构上)。
当“创建”文件时(例如使用UNIX touch
命令),操作系统首先在信息块(目录)中创建一个条目,其中包含以下内容:
仅当有一些数据要“写入”时,它才会尝试找到一个空的数据块来存储数据。但是数据块具有固定大小(例如32K),方便磁盘访问和OS读取。如果您只写“ Hello”,则大多数块为“空”(实际上可能不是零,而是以前的值是垃圾),因此表现在还将大小更新为长度(例如5个字符+ End of文件),这样您就不会弄坏东西。
当您将“文件”更新为长度>块大小时,操作系统会将数据写入新块并更新数据块,以表示文件在第一个(依此类推)之后继续到下一个块,并更新长度。新长度(细节有所不同)。
您最终得到的是信息数据块(目录或列表)的集合,其中包含有关数据块链(文件内容)的信息。
从逻辑上讲,这也解释了为什么在同一文件系统上移动的文件快速闪烁,而复制却需要很长时间。操作系统仅需编辑2个目录块即可从一个目录(信息数据块)中删除条目,然后添加到另一个目录中。删除文件:只需删除目录块中的条目,释放要重新分配的文件数据块。
ps:仅仅因为卡片目录中有某本书的条目,并不意味着它就已经搁置了(也许已签出或丢失);文件大小为0。
pps:库中放错地方的书意味着搜索库,或用计算机术语表示:chkdsk或修复盘!
通过阅读有关UNIX索引节点或了解版本控制系统(ClearCase,TFS,Git等)如何不仅管理文件和目录,而且还管理文件的版本甚至目录的版本,可以加深了解。在大多数情况下,所有内容都存储在数据库中,并呈现给用户以显示为经典目录结构和文件!
文件系统存储有关文件的大量信息,例如文件名,文件大小,创建时间,访问时间,修改时间,创建的用户,用户和组权限,片段,指向存储文件的群集的指针,硬/软链接,属性...这些被称为文件元数据。当用户不(不需要)关心它们并且不知道它们时,为什么将这些元数据计入文件大小?他们只在乎文件内容
此外,每个文件系统存储不同类型的元数据,这些元数据在磁盘上占用不同的空间量。例如,POSIX权限与NTFS权限有很大的不同,并且inode
POSIX 中也有一些数字在Windows中不存在。甚至POSIX文件系统也相差很大,例如具有32位块地址的ext3,具有48位地址的ext4,具有64位地址的Btrfs和具有128位地址的ZFS。那么如何将这些元数据计入文件大小?
再以一个100字节的文件为例,该文件的元数据在当前文件系统上消耗56字节。我们将文件复制到另一个文件系统,现在它需要128个字节的元数据。但是文件内容完全相同,文件中的字节数也相同。因此,在一个系统上将文件大小显示为156字节,在另一个系统上显示为228字节,这非常令人困惑和违反直觉。
以一种简单的方式理解它...创建文件时..将生成一个目录条目,该目录条目用作由您提供的文件名标识的文件存储位置的指针。当您创建越来越多的指针或说文件时,目录的大小会增加。而仅当您将一些数据放在指定的位置即文件本身内部时,文件的大小才会增加。到那时,大小将为零。:)
因此,它是这样工作的:
一旦在卷上创建任何文件,它就会在NTFS mata文件(即$ MFT(主文件表))中创建一个文件记录。由于MFT中存在FRS(文件记录段),因此您将看到一条记录。对于NTFS文件系统,每个文件记录的大小默认为1 KB。但是只有在文件中存储一些信息时,才会占用该空间。即使您只考虑一个文本文件而只写一个字母“ a”,它也会占用1 KB的空间,因为这是FRS的默认大小。字母“ a”转到该FRS的默认和未命名数据流$ Data,这是一个属性,如果您没有ADS(备用数据流),则所有数据将流向该属性。
如果您有任何疑问,请告诉我。