当您覆盖文件时,以前的空间会释放吗?

当您覆盖文件时,以前的空间会释放吗?

假设您有一个名为的文件,foo.txt500大小为 字节。假设您创建一个10大小为 字节的新文件并将其另存为,从而覆盖该文件。操作系统(Windows 和 Linux)是否会自动确保释放foo.txt不再使用的空间(字节)?410

在第二种情况下,假设你使用了dd 实用程序如上所述创建旧的和新的 foo.txt。操作系统是否会自动确保释放不再使用的空间?

我想象在幕后,对文件的所有写入都使用相同的操作系统调用,因此覆盖处理在程序之间将是一致的......

答案1

听起来你的问题源于认为这个过程涉及几件事:所有未使用的空间都可用于其他用途,并且将与现有文件同名的文件写入同一位置。这两个前提都不准确。此外,你还谈到了不再使用的空间被释放。从工作方式来看,这些术语有点同义;空间要么分配给文件,要么不分配给文件。

正如 davidgo 所述,驱动器以整个扇区或块为单位工作。为了简单起见,我将空间分配单位称为“块”。空间以整个块为单位分配。1 字节文件分配整个块,因此如果您讨论的是小文件,则大小小于一个块的任何文件仍会分配整个块。小(子块)文件在块中有未使用的空间,这些空间无法用于其他目的。您可以谈论使用多个块的大文件被使用较少块的小文件替换。在这种情况下,整个块不再需要。

旧文件实际上并没有被覆盖。新文件会保存在另一个位置,使用所需的块。文件系统的文件表中对旧文件块的引用会被修改。这些块将不再分配给任何文件,可供重复使用。旧文件的内容不会在此过程中被删除,只会被忽略,直到需要空间为止。这就是您能够恢复已删除文件的原因。

您问如果使用 dd,情况是否会有所不同。dd 有很多种用法。如果您将讨论限制为简单地使用相同名称编写新文件,那么效果是一样的。

答案2

正如 @KamilMaciorowski 所说,问题的关键部分是磁盘中的块大小。现代文件系统的块大小小于 512 字节的情况非常少见(大多数文件系统的块大小要大得多)。这很重要,因为这意味着如果你处理的文件操作小于块大小,这些操作使用的资源与块大小一样多 -所以你的问题的答案是“否”——400 字节的文件占用 1 个块,将被另一个占用 1 个块的文件替换。原始块可能会被释放(但可能会被覆盖),但你没有节省任何磁盘空间

我想您知道这一点,但对于其他人来说 - 还值得注意的是,当一个块被释放时,它通常不会被覆盖/清空,并且通常可以恢复。因此,在 SSD 上更是如此,它进一步将我们在磁盘中的内容与操作系统看到的内容抽象化(这要归功于磨损均衡)。

相关内容