编辑文本文件是否会替换/擦除硬盘上写入的字节?

编辑文本文件是否会替换/擦除硬盘上写入的字节?

因此,当您删除 PC 上的文件时,它会删除该文件的指针而不是实际的字节,这些字节会一直保留直到被覆盖。

如果您有一个仅包含单词“Hello”的 txt 文件,并且我将内容发送给“Aljoe”,那么这种更改会覆盖文件的原始字节吗?还是仅删除该文件的指针并创建另一个具有相同属性但不同内容的文件。

这是否意味着“Hello”txt 文件可以恢复或者“Aljoe”文本已替换该文件。

希望这有意义...

答案1

这取决于许多因素 - 包括您选择的编辑器、文件系统和存储技术......

编辑

有些编辑者会简单地重写该文件。

但是许多编辑器会创建一个临时文件,该文件在写入完成之后会重命名以替换旧文件。这使得“保存”操作具有原子性 - 也就是说,该文件肯定会包含 A) 旧内容或 B) 新内容。如果系统的一部分发生故障(例如:断电或应用程序崩溃),则“就地”写入文件可能会出现文件部分写入或损坏的情况。

考虑以下伪代码/步骤:

# user opens file "myfile.txt"
f = open("myfile.txt", "r")
buffer = f.read()

# user edits file in-memory

# saves file as "myfile.txt"
f = open("_myfile.txt", "w")
f.write(buffer)
f.close()
rename("_myfile.txt", "myfile.txt")

如果你对这里的技术细节感兴趣,那么你可能会有兴趣知道,当使用这样的编辑器时,文件的 inode / 文件 ID 可能会在每次保存时发生变化......我们开始进行关于“什么是哲学讨论”的讨论。文件“实际上是......现在,让我们考虑一下”文件“是文件系统中指定位置(文件名)可访问的数据。

文件系统

即使您的编辑器很“笨”,只是重写了文件的内容,正在使用的文件系统也有可能将“新”数据记录到它认为合适的任何位置,在某些情况下,它们会采用与上述类似的技术 - 写入一个新块以完成,然后重新链接文件表。

这可能由于多种原因而有必要,包括该位置可能没有足够的可用空间来存储新数据。

存储技术(磁盘)

当你考虑 SSD 时,事情会变得更进一步。当你“写入 SSD 上的物理位置”时,你实际上是在写入完全不相关的确实闪存中的物理区域,对您来说完全是未知的 - SSD 保存着“物理”块到“真实物理”块的映射。

SSD 和其他闪存通常还会将数据写入预先擦除的页面(因为这样更快捷、更方便),而不是擦除给定页面然后重新写入。这也有助于磨损均衡,否则,如果文本文件的内容始终位于相同的物理闪存单元中,那么处理一天的文本文件就可能会看到单元磨损。

结论

因此...根据你提供的信息,我怀疑,仅仅“修改文件中的文本“实际上将从持久存储中删除旧文本。


证明

想亲自尝试一下吗?在 Linux 上运行以下命令:

创建文件系统并挂载它:

$ truncate -s $(( 10 * 1024 * 1024 )) myfs.ext2
$ mkfs.ext2 ./myfs.ext2
mke2fs 1.42.13 (17-May-2015)
Discarding device blocks: done
Creating filesystem with 10240 1k blocks and 2560 inodes
Filesystem UUID: 42d13441-a9c1-44e1-9310-275c92c60f15
Superblock backups stored on blocks:
        8193

Allocating group tables: done
Writing inode tables: done
Writing superblocks and filesystem accounting information: done

$ mkdir mnt
$ sudo mount -o loop ./myfs.ext2  ./mnt
$ sudo chown attie: ./mnt

提前检查是否“你好“实际上是磁盘的数据(但事实并非如此):

$ grep "Hello" myfs.ext2

写一个 ”你好“到myfile.txt文件系统中:

$ echo "Hello" > ./mnt/myfile.txt
$ sync

检查是否“你好“现在有 (有):

$ grep "Hello" myfs.ext2
Binary file myfs.ext2 matches
$ cat ./mnt/myfile.txt
Hello

写 ”阿尔乔“ 到myfile.txt

$ echo "Aljoe" > ./mnt/myfile.txt
$ sync

检查是否“你好“现在在那里(它仍然“在磁盘上”,但不在文件中):

$ grep "Hello" myfs.ext2
Binary file myfs.ext2 matches
$ cat ./mnt/myfile.txt
Aljoe

这不仅适用于简单echo,也适用于vim


更新

我刚刚在 Windows 上尝试过这个(对我来说不太可用),看起来 FAT 和 NFTS 都会重新使用已分配的存储,而 ext2/3/4 将分配新的存储。

此外,快速查看 Notepad++ 和 Atom 后发现,“写入并重命名”方法并没有像我预期的那样使用 - 虽然它由 等应用程序使用vim

我认为更正确的答案可能是:

  • 如果您正在运行 Windows,那么数据可能会立即被覆盖。
  • 如果您运行的是 Linux,那么数据可能仍保留在持久存储中。

大概“,因为这些说法当然也有例外。

答案2

我不能绝对肯定,但我非常肯定,大概 99% 肯定,原始文本已被覆盖并消失了。如果您尝试使用恢复程序,我认为它无法恢复,因为字节已被覆盖。恢复程序并不以获取文件的先前修订版本而闻名!如果它确实删除了指向旧数据的指针并将新数据存储在其他地方,那么它们就会以获取文件的先前修订版本而闻名!或者人们会恢复文件并必须选择哪个版本,或者会从较早的保存中获取文件的版本,而这是从未听说过的。

相关内容