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

Bit*_*123 59 editing

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

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

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

哪个想法代表了计算机的工作方式?

use*_*686 122

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

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

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

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

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


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

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

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

  • 这不仅仅是在文件系统级别上。例如,闪存必须先清除一个块,然后才能对其进行写入。因此,在实践中,它通常会简单地通过将新更改写入新块并在旧块上使其无效来写入文件。通过让设备本身自动处理这类事情,操作系统可以只使用普通的硬盘驱动器文件系统。 (30认同)
  • @trlkly:所有现代闪存设备都被划分为比磁盘扇区大几个数量级的擦除区域,并且不能在不擦除所有区域的情况下回收该区域的任何部分。因此,如果一个区域包含 32 个过时扇区的数据和 224 个有用数据扇区,则必须将 224 个有用数据扇区复制到其他地方,然后才能从任何过时扇区中释放空间。现代操作系统使用“trim”命令来指示磁盘扇区,如果它们所在的块被回收,则可以放弃其内容。 (7认同)
  • @jamesqf:嗯,问题_是_当文件被“编辑*并保存*”时会发生什么...... (4认同)
  • 许多编辑器只是将文件读入内存并在那里进行所有更改。(也许周期性地将正在进行的工作的副本自动保存到不同的地方。)在您保存更改之前,原始文件根本不会更改,例如使用 vi 的 :w 命令。 (2认同)

hyd*_*yde 6

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

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

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

方案一:对原文件进行重命名,这样原目录项和原数据都将保留在磁盘上。例如,重命名可能会将文件后缀更改为.bak.bak通常删除任何以前的文件)。然后创建一个新文件并将内存中的数据写入那里。

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

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

所以你的理论 1 接近大多数编辑所做的。


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

所以你的理论 2 在某些情况下是可能的,但普通的文本编辑器等不会这样做。