如果code.txt
(或任何文件)被编辑并保存,我对 PC 如何处理该过程有两种想法:
PC 会
code.txt
彻底删除并code.txt
从头开始创建一个新的(编辑版本)。PC 编辑了 的十六进制部分
code.txt
。因此没有发生删除。
哪种想法代表了计算机的工作方式?
答案1
可能是——这取决于所使用的文本编辑器。
“文本文件”的概念并非内置于计算机中 - 每个操作系统可能以不同的方式管理文件,并且每个文本编辑器可能以不同的方式使用这些文件。
实际上,你会发现文本编辑器同时具备这两种机制。几乎所有操作系统允许直接覆盖现有文件的内容,因此记事本等简单编辑器通常只要求操作系统直接写入原始文件,因为这最容易实现——但如果在写入过程中断电,则有风险。因此出于可靠性原因,许多编辑器故意地将更新的数据保存到新文件并删除原始文件。
(我认为就地更新在十六进制编辑器中更常见,其中大多数编辑不会插入/删除字节,而只会更改现有位置,因此不需要完整的重写文件。)
甚至还有第三种操作模式——编辑者可能首先备份旧文件,然后直接将新数据写入文件。
它还取决于保存文件的文件系统。对于大多数传统文件系统,如果程序要求写入现有文件,文件系统将直接覆盖旧数据。
然而,有些文件系统做在“写时复制”模式下工作,任何新数据始终被写入不同的位置,无论程序是否需要。同样,这可能具有提高可靠性的优势,因为中断的更改可以完全恢复。
在某些文件系统(例如 Btrfs 或 ext4)中,这是一个可选功能;在其他文件系统(例如日志结构文件系统)中,它是核心设计的一部分。
答案2
由于您正在谈论“保存文件”,那么文件将不会在磁盘上被就地编辑。
对于通常文件系统中的文件,需要考虑两件事。一个是目录条目,另一个是磁盘上某处的实际文件数据。
当你在普通编辑器中编辑文件时,它会将文件数据加载到 RAM 中,任何编辑都只会在该数据副本上进行。然后,当你保存文件时,基本上有两个选项:
选项 1:原始文件是改名,因此原始目录条目和原始数据都将保留在磁盘上。重命名可能会将文件后缀更改为.bak
(通常会删除任何以前的.bak
文件)。然后创建一个新文件并将内存中的数据写入其中。
选项 2:修改原始目录条目,以便文件截断长度为 0。磁盘上用于文件数据的区域将被标记为未使用,但旧文件内容将保留在磁盘上,直到被覆盖。然后写入新数据。在这种情况下,目录条目保留,只是它指向的数据被更改。
有几种可能的情况,一种常见的情况是,编辑的数据首先被存储到临时文件中,因此如果您的计算机此时崩溃,原始文件可能不会被损坏。然后删除原始文件,并使用正确的名称重命名新文件。或者,可以在写入新文件之前删除原始文件。
所以你的理论 1 与大多数编辑的做法很接近。
然后还有特殊情况。最明显的是磁盘编辑器,它允许直接在磁盘上读取和覆盖字节。另一个可能是数据库文件,其中记录可能是固定大小,因此很容易覆盖记录。但是数据不能附加在文件的中间,因此编辑文本文件或任何其他文件中间数据长度通常会发生变化的文件时,这些技巧实际上不能使用。
因此,您的理论 2 在某些情况下是可行的,但普通文本编辑器等却无法做到这一点。
答案3
从历史上看,驱动器直接由操作系统控制,而操作系统又由应用程序控制。在这种情况下,理论 2 是 PC 的主要工作方式。操作系统指定身体的计算机可以确定数据存放的位置,并完全控制此过程。因此,早期的文件系统有一个“坏扇区”表,因此在数据丢失后,计算机可以告诉您数据已丢失并将该扇区标记为不可用,以避免更多数据丢失。磁盘扫描和碎片整理是当务之急。
然而,在世纪之交之后,我们转向了 LBA,因此现在操作系统只需引用它想要读取或写入的“逻辑”块即可。硬盘本身现在具有智能,可以在操作系统不知情的情况下在操作系统背后移动数据。这意味着更好的可靠性,因为无法验证的扇区可以简单地移动到新的物理位置,而不会影响操作系统对数据所在位置的了解。
在现代硬件中,“盘片”磁盘驱动器通常只是用新传入的数据覆盖之前的内容,并且如果扇区看起来可能无法保留数据(扇区已损坏或磨损),则可选择重新映射 LBA。“闪存”驱动器通常会擦除旧单元,然后将数据写入新单元,这一过程称为磨损均衡。
在这两种情况下,这都是可能的,因为总是存在超出报告值的未使用容量。这种过度配置使驱动器的使用寿命比上个世纪相当不可靠的技术更长。LBA 模式使物理介质可以从操作系统中抽象出来,这样驱动器本身就可以采取驱动器认为必要的任何措施来防止数据丢失。
在应用程序级别,您通常以“写入”模式打开文件,这会告诉操作系统清除文件(“删除”内容,但不删除文件本身),然后写入新数据。所有这些都在操作系统级别缓冲,然后“刷新”到驱动器,从而进行请求的更改。
鉴于这些信息,理论 1 在技术上是在应用程序编程级别发生的,至少默认情况下是这样,因为还有一个“写入并附加”模式来避免清除文件内容。操作系统本身将更像理论 2 那样呈现要进行的更改,但通过 LBA 抽象化。然后,驱动器本身可能会执行理论 1 和理论 2 的混合操作。
是的。这很复杂,而且非常依赖制造商/操作系统开发人员/应用程序开发人员。然而,所有这些复杂性都是为了使数据存储更可靠,同时提高功耗/电池寿命。
答案4
虽然还有其他答案,但我会尝试给出完整的答案,以便您能够从各个层面理解它,从问题到解决方案,以及它们的工作原理。
简短回答
高度依赖于您的编辑器、底层软件/驱动程序和存储。
怎么办:如果您想永久删除,对于大多数用户来说,搜索“安全删除文件”可以解决问题。如果您的情况不是“大多数用户”的情况 - 没有简单的答案;)
偏执狂的简短回答
是可以恢复的,除非你使用高设置下的特定工具组合将其永久删除。
长答案
您的问题中缺少信息(软件、硬件等),因此我不会亲自回答,而是帮助您自己回答您的问题。
事情没那么简单直接。文件可能会经过多层,而且可能会在任何地方保留一段时间或很长时间。
Editor <-> Memory <-> Backup/VCS/diff disk/etc if exists <-> OS <-> File System <-> Storage cache <-> Storage
根据您的环境配置,可能会添加或删除上面的某些层。因此,为了给出完整的答案,我将提供有关每个层的信息,您可以根据自己的情况选择相关点。
- 编辑:
- 编辑器可能会将文件的旧版本(或新版本)暂时保存在其他地方。然后删除文件后,其旧版本(或新版本)可能仍会保留在某处。例如,MS Word 会创建此类临时文件,以便在崩溃后恢复文件。
- 如果编辑软件取代编辑同一文件时,该文件的位,然后文件能编辑时会被重写。因此,可能使用此类编辑器用随机位填充文件,使其更难恢复。
但这也可能取决于编辑器设置和文件类型。
请注意可能以斜体显示。即使编辑者重写了文件,它仍然可能保持原样/恢复(阅读下一点)。
- 底层软件/驱动程序/文件系统:
- 文件系统可能标记将已删除文件的空间视为“可用”,而实际上并未清理它。他们这样做是为了节省性能,因为完全清理文件需要更多操作(通过磁盘、CPU)。因此,删除文件后,它仍可能恢复。
“格式化磁盘”也是如此,尤其是“快速格式化”选项。您可能已经看到过不同的文件恢复工具,它们在删除文件甚至格式化磁盘后仍能工作 - 大多数都可以因此而工作。 - 如果该文件下有其他软件/驱动程序,则文件将保持不变保护初始文件被覆盖。这些类型的软件包括版本控制系统、虚拟差异磁盘、一些备份软件。一个例子是Git,它将保留原始文件块并创建包含修改后的块的新文件。
- 贮存:
存储本身可以将更改的块写入新的扇区,并将旧块标记为“空闲”。然后文件将物理上保留在存储中(并且可以恢复),除非它被覆盖由另一个文件。示例是现代SSD存储,这可能在硬件层面上实现。
即使数据被损坏,也有办法从典型的机械硬盘的磁盘中恢复数据覆盖.并且有专门的公司从事这方面工作。
- 记忆:是的,它也可以保留在内存中 - RAM、视频 RAM、缓存等。这取决于您使用的编辑器/查看器。大多数软件在使用后不会安全地清理内存。在内存被其他应用程序重用之前,文件可能在一段时间内仍可从内存中恢复。例如,一个典型的文本文件在编辑和删除后可能会保留在 RAM 中。而图像(或整个屏幕)可能从视频 RAM 中恢复在关闭和删除之后。不仅是图像,甚至浏览器的屏幕也可能会在一小时后仍保留在视频内存中。
因此,如果您想得到一个具体的答案,您的文件是否会被删除,您还应该说明您使用什么文件、编辑器、备份/VCS 软件、文件系统、硬件、存储。
如何真正删除该文件?
这可能是您接下来会问自己的问题。有很多软件/硬件解决方案。由于 SuperUser 是不是对于推广软件/硬件,我不会告诉你名字,而是告诉你如何寻找他们。
- 要从存储中删除文件:搜索关键字“安全删除文件”。要获得更精确的匹配,请在查询中添加您的操作系统、硬盘类型或其他信息。
- 要从内存/缓存中清理它:搜索“安全清理 RAM | 视频 RAM | 硬盘缓存”。
您可能已经注意到,这里的主要关键词是“安全清理”。
接下来的问题可能是:
- 这些软件是如何工作的?
它们用 0、1 或随机位覆盖文件/内存的空间几轮,这样旧信息就无法恢复。 - 我可以信任他们吗?
视情况而定。如果您希望将其用于安全应用程序(例如银行业务),以便获得安全认证(这是金融机构所必需的),那么您可以信任已通过认证的官方商业工具。请务必检查该工具的认证。例如,如果您是银行管理员,并且法规要求在使用后安全删除文件 - 那么情况就是这样。
如果您想要自己使用它,可以阅读和理解代码和算法 - 您也可以选择经过实战测试的开源解决方案。
希望这能有所帮助。
如果有遗漏之处,请随时发表评论!