PC编辑文件时,会删除原始文件吗?


55

如果code.txt(或任何文件)被编辑并保存,那么我对PC如何处理该过程有两个想法:

  1. PC会code.txt完全删除并code.txt从头开始制作新的(编辑版本)。

  2. PC编辑十六进制的部分code.txt。因此不会发生删除。

哪个想法代表计算机如何工作?


问候!根据用户Grawity提供的出色答案,以下是一些需要澄清的问题:

18
@HaakonDahl有什么澄清的问题?你什么也没张贴。
大鸭

该死的。必须等到我重新回到PC上。但是要点是什么级别-硬件,文件系统,操作系统还是应用程序?还有什么应用程序?

为什么对您很重要?即使创建“新”文件的程序也可能会更改创建时间,以使其与原始文件匹配。唯一可见的区别是可能很重要的inode编号(或等效概念)(例如,如果周围有硬链接,它们将“不同步”)。
巴库里

1
投票结束这个问题的范围过于广泛。这完全取决于操作系统,软件和基础文件系统的功能。
JakeGould

Answers:


121

可能是-取决于所使用的文本编辑器。

“文本文件”的概念不是内置于计算机中的-每个操作系统可能会以不同方式管理文件,并且每个文本编辑器可能会以不同方式使用这些文件。

在实践中,您会发现具有两种机制的文本编辑器。实际上,所有操作系统都允许直接覆盖现有文件的内容,因此,诸如记事本之类的简单编辑器通常只要求操作系统直接将其写入原始文件即可,因为这是最容易实现的操作-但如果在写入过程中断电,则存在风险。因此,出于可靠性的考虑,许多编辑器故意将更新的数据保存到新文件中并删除原始文件。

(我认为就地更新在十六进制编辑器中更为常见,在十六进制编辑器中,大多数编辑不插入/删除字节,而仅更改现有位置,因此不需要完整的重写文件。)

甚至还有第三种操作模式–编辑器可能会首先制作旧文件的备份副本,然后直接将新数据写入文件中。


取决于其保持文件的文件系统。对于大多数传统的文件系统,如果程序要求写入现有文件,则文件系统将仅就地覆盖旧数据。

但是,某些文件系统确实可以在“写时复制”模式下工作,在该模式下,无论程序是否需要,任何新数据都会始终写入不同的位置。同样,这具有提高可靠性的可能优点,因为中断的更改可以完全恢复。

在某些文件系统(例如Btrfs或ext4)中,这是一项可选功能。在其他情况下(例如日志结构的文件系统),它是核心设计的一部分。


30
它不仅在文件系统级别。例如,闪存必须先清除一个块,然后才能对其进行写入。因此,在实践中,通常只需将新更改写入新块并在旧块上使其无效就可以将文件写入文件。通过由设备本身自动处理这种事情,操作系统可以只使用普通的硬盘文件系统。
trlkly

7
@trlkly:所有现代闪存设备都被划分为擦除区域,擦除区域的大小比磁盘扇区大几个数量级,并且在不擦除所有区域的情况下无法回收该区域的任何部分。因此,如果一个区域包含价值32个废弃扇区的数据和224个有用数据的扇区,则它必须在其他位置复制224个有用数据的扇区,然后才能释放任何废弃扇区的空间。现代操作系统使用“ trim”命令来指示磁盘扇区,如果其所在的块被回收,则可以放弃其内容。
超级猫

一些编辑器在运行时选择要使用的行为(例如,取决于文件是否只有一个命名该目录的目录条目或多个)。
Toby Speight

2
许多编辑器只会将文件读入内存并在其中进行所有更改。(也许会自动将正在进行的工作副本自动保存到其他副本。)直到您保存更改(例如,使用vi的:w命令),原始文件都不会更改。
jamesqf

4
@jamesqf:好吧,问题当文件“被编辑并保存 ” 时会发生什么...
grawity

6

由于您正在谈论“保存文件”,因此不会在磁盘上就地编辑文件。

对于普通文件系统中的文件,有两点要考虑。有目录条目,然后磁盘上某处有实际的文件数据。

当您在普通编辑器中编辑文件时,它将文件数据加载到RAM中,并且任何编辑都将在该数据副本上进行。然后,当您保存文件时,基本上有两个选择:

选项1:重命名了原始文件,因此原始目录条目和原始数据都将保留在磁盘上。重命名例如可以将文件后缀更改为.bak.bak通常删除任何先前的文件)。然后创建一个新文件,并将内存中的数据写入那里。

选项2:原始目录条目已修改,因此文件被截断为0个长度。磁盘上用于文件数据的区域将被标记为未使用,但是旧文件内容将保留在磁盘上,直到被覆盖。然后写入新数据。在这种情况下,保留目录条目,仅更改它指向的数据。

有几种可能的变体,一种常见的变体是,已编辑的数据会首先存储到临时文件中,因此,如果此时计算机崩溃,则原始文件可能不会被损坏。然后删除原始文件,并使用正确的名称重命名新文件。或者,可以在写入新文件之前删除原始文件。

因此,您的理论1接近大多数编辑者所做的事情。


然后是特殊情况。最明显的一个是磁盘编辑器,它允许直接在磁盘上读取和覆盖字节。另一个可能是数据库文件,其中记录的大小可能是固定的,因此覆盖记录很容易。但是不能将数据追加到文件的中间,因此在编辑文本文件或文件中间的数据长度通常会发生变化的任何其他文件时,这些技巧实际上无法使用。

因此,在某些情况下,您的理论2是可能的,但是普通的文本编辑器则不行。


1
“由于您正在谈论“保存文件”,因此不会在磁盘上就地编辑文件。” -我认为只要您“打开”文件,对其进行编辑并将更改写回到磁盘上,就意味着您正在“保存文件”,而不管文件是“就地写入”(覆盖)还是旧文件被删除或重命名并创建一个新文件。无论哪种方式,您通常都在某个时候决定“保存更改”或“放弃更改”。
凯文·费根

@KevinFegan好吧,您可以在合适的磁盘或十六进制编辑器中打开文件,编辑内容并保存更改。或者,您可以打开一个数据库文件(例如SQLite数据库文件),然后修改数据库,并将更改提交到该文件。因此,仅打开文件进行修改就意味着就地对其进行修改,但是“保存文件” 通常意味着创建了一个新文件,而这些其他替代方法也具有不同名称的操作来保存更改。
海德

4

从历史上看,驱动器直接由操作系统控制,而操作系统又由应用程序控制。在这种情况下,理论2是PC工作的主要方式。操作系统指定了放置数据的物理位置,并且可以完全控制此过程。结果,早期的文件系统有一个“坏扇区”表,因此,在丢失数据后,计算机可以告诉您数据已丢失,并将该扇区标记为无法使用,以避免更多数据丢失。磁盘扫描和碎片整理已成为日常工作。

但是,在世纪之交之后,我们搬到了LBA,因此现在的OS只需引用它要读取或写入的“逻辑”块。硬盘驱动器本身现在已经具有智能,可以在不注意到操作系统背后数据的情况下随机播放数据。这意味着更高的可靠性,因为可以将无法验证的扇区简单地移动到新的物理位置,而不会影响操作系统对数据所在位置的了解。

在现代硬件中,“拼盘”磁盘驱动器通常只会用新的传入数据覆盖以前的内容,并且在扇区看起来无法保留数据(扇区已损坏或磨损)时,可以选择重新映射LBA。“闪存”驱动器通常会擦除旧单元,然后将数据写入新单元,这一过程称为耗损均衡。

在这两种情况下,这都是可能的,因为总有未使用的容量超出报告值。与上个世纪的技术不太可靠的技术相比,这种超额配置可以使驱动器具有更长的使用寿命。LBA模式使物理介质可以从OS中提取出来,以便驱动器本身可以采取驱动器认为必要的任何措施来防止数据丢失。

在应用程序级别,您通常以“写入”模式打开文件,这会告诉操作系统清除文件(“删除”内容,而不是文件本身),然后写入新数据。所有这些都在操作系统级别进行缓冲,然后“丢弃”到驱动器,从而进行请求的更改。

有了这些信息,理论上至少在默认情况下会在应用程序编程级别上发生理论上的变化,至少在默认情况下是这样,因为还有一种“带有附加的写入”模式以避免清除文件内容。操作系统本身将提出要像理论2那样进行的更改,但将通过LBA进行抽象。然后,驱动器本身可能会完成理论1和理论2的混合工作。

是的 它很复杂,并且非常依赖于部分制造商/ OS-developer / application-developer。但是,所有这些复杂性旨在使数据存储更可靠,同时提高电源使用/电池寿命。


3

要看。AFAIK Microsoft Word在启用快速保存选项的情况下保存.doc(而非.docx)文件时,会将自上次保存以来对文件所做的更改附加到现有文件中。


1

一般来说,计算机会将原始文件所在的内存分配为“已删除”,但这实际上意味着它不再显示在文件浏览器中,并且允许写入该文件的内存中的单元格将来会被覆盖。

至于是否将新文件写入同一位置,取决于许多因素,主要是您所使用的软件以及如何设计以利用内存。


2
我认为您可能将“内存”与文件系统取消链接操作的概念混淆了。这实际上与所陈述的问题无关,该问题询问具体文件是否被覆盖或是否存在某种n向更新。

好吧,如果专门设计软件来做到这一点,那是有可能的,尽管据我所知,这通常是长期存储和RAM的工作方式。
GigaJoules

不幸的是,您的解释(据我所能解释的意思)绝对不是 “长期存储和RAM”的工作原理。但是,归根结底,这与眼前的问题无关。我重申一下,这是在询问软件如何将文本信息更新为具有典型现代文件系统的通用计算设备上的文件。我们不必考虑“内存”之类的东西如何回答这个问题。

1

希望这不是多余的,还有一些额外的信息/背景。

PC通常对文件的编辑方式没有太多控制权,而是由应用程序来完成。

有关某些应用如何处理编辑的一些示例:

记事本将整个文档加载到内存中,然后将整个内容保存到原始文档(或您指定的新文档)上。

几乎所有其他小型编辑器在编辑时都会保存一个“新”文件,然后将其复制到原始文档中,并在“保存”时将其删除。

您可能用来编辑书籍的大型文档编辑器往往会读取/修改文档的一部分,因为他们可以编辑比内存更大的文档。这些实际上可以编辑文档“就地”。他们可能会重写一页,而将其余部分保留下来。与允许这种行为的简单.txt文件相比,它们通常具有更复杂的索引磁盘表示形式。

大型编辑器也可能只是将带有“更新”的临时文件保存到原始文档中。完成最终保存后,它可以将它们全部合并并重新编写文档。

可以将大多数编辑器配置为不更改现有版本,并使用您的更改创建一个新版本(保留旧版本)。

关于您的“ PC”功能部分,某些操作系统会记住文件的每个版本,并始终创建一个新版本。这些天这很少见,但我记得旧的“小型计算机”(我们现在称为大型机),其中每个文件的末尾都有一个版本,例如“ File.text.1”,并且每次您添加该版本时编辑。这种行为最好适用于诸如磁带驱动器或CD rom之类的东西,在这些东西上覆盖旧版本是完全不切实际的。


1

2并非不可能,但是由于各种原因它是愚蠢的。

编写良好的文本文件编辑器将:

  1. 编写一个具有不同名称和新内容的文件。如果原来是myfile.txt,新的可能是myfile.txt.new
  2. 提供1.成功后,将原文件重命名为备份文件,说 myfile.txt~
  3. 将新文件重命名为原始名称 myfile.txt
  4. 如果一切成功,请删除备份文件。无论如何,许多编辑器都会保留它,因此,如果用户很快发现他/她对编辑器所做的工作不是他/她想要做的,则用户可以恢复。

如果在上述过程中计算机崩溃或磁盘上的空间不足,则不会出现旧文件和新文件都丢失或仅部分保存的情况。


在过去的半个世纪中,用于非IBM /非Microsoft操作系统的许多文本编辑器的在位截断和重写行为都不是“愚蠢的”。
JdeBP

1

简短答案

高度取决于您的编辑器,基础软件/驱动程序,存储。


偏执的答案

可以恢复,除非您将其永久删除。


长答案

您的问题(软件,硬件等)中缺少信息,所以除了自己回答我,我将帮助您自己回答问题。

它取决于几个因素:

  1. 编辑器:如果编辑器软件替换了同一文件的块,则可能会被重写。并且这也可能取决于编辑器设置和文件类型。请注意,该词可能用斜体表示。即使编辑器重写了文件,它仍然可以保持不变(请阅读下一点)。

  2. 底层软件/驱动程序/文件系统:如果下面有其他软件/驱动程序可以防止原始文件被覆盖,则文件将保持不变。这些类型的软件包括版本控制系统,虚拟差异磁盘和某些备份软件。Git是一个示例,它将保留原始文件块,并创建包含修改后的块的新文件。

  3. 储存方式

    • 存储本身可以在扇区上写入更改的块,并将旧块标记为“空闲”。然后,该文件将物理保留在存储中(并且可以恢复),除非它被其他文件覆盖。现代SSD存储就是一个例子,它可以在硬件级别实现。

    • 即使数据被覆盖,也有一些方法可以从典型的机械HDD磁盘中恢复数据。并且其中有专门的公司。

因此,如果您想获得具体的答案,无论是否删除文件,还必须告诉您使用的编辑器,备份/ VCS软件/硬件和存储。如果有任何遗漏,请随时编辑答案。


如何确保已删除的文件实际上已从存储中删除?

这可能是您要问自己的下一个问题。嗯,有许多软件/硬件解决方案。由于SuperUser并非用于推广软件/硬件,因此我不告诉名称,而是告诉您如何查找它们:搜索关键字“ permanently delete file”。有关更精确的匹配项,请提及您的操作系统,硬盘驱动器类型或其他信息。


1

尚未有人提到的与某些版本的MS Windows操作系统有关的行为也与使用中的文件系统有关。

行为是这样的:重命名或删除文件时,如果在删除(或重命名)原始文件后的15秒内创建(重新创建)具有相同名称的(新)文件,则创建日期/时间戳是从原始文件复制的。本质上,新文件“成为”旧/原始文件。

在这种情况下,应用程序是通过方法1:使用相同名称创建新文件,还是方法2:在适当位置编辑/更新文件(文件未删除)。无论哪种方式,最终文件都会(几乎)像原始文件一样进入所有位置。唯一的是,它可能会占用不同的物理驱动器空间(群集/扇区),并且文件的目录条目可能会位于不同的位置。

正如我所说,这是某些版本的MS Windows /文件系统的行为。我不知道它是从哪个版本的Windows和哪个文件系统开始的,是否仍然是更新版本的行为。如果我不得不猜测,我会说它是在Windows NT和Windows XP上引入的,并且仍然是Windows 10的行为,并且(仍然是猜测),这种行为需要Fat32或NTFS(也许是更新的)文件系统。


实际上,这确实很重要,因为NTFS支持硬链接,并且这些方法之间众所周知的区别之一是对多重链接文件的影响。至少从Windows NT 5.0开始,文件系统隧道就已经存在。
JdeBP

@JdeBP-是的,我们同意。这就是为什么我说#1)“最终文件在各个方面(几乎)像原始文件一样(几乎)查找”,以及#2)目录条目位于不同位置的原因。
凯文·费根

您不同意您是否断言这并不重要。
JdeBP
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.