如果在只读模式下读取文件时断电,该文件的数据是否会丢失?

If power is lost while a file is being read in read-only mode, can that file's data be lost?

如果在只读模式下读取文件时断电,该文件的数据会丢失吗?

Python中的示例:

>>> f = open("example.txt", "r")
>>> first_line = f.readline()
>>> second_line = f.readline()
>>> # Here the machine executing the above code unexpectedly powers off. 

If power is lost while a file is being read in read-only mode, can that file's data be lost?

有人会认为,既然您以只读模式打开文件,答案就是肯定的 "no"。我想到了两种情况:

硬件故障

如果是硬盘,磁头必须在盘片上方才能读取文件。如果停电,那可能只是导致磁盘彻底失效的最后一根稻草。

访问次数

文件元数据。即使以只读方式打开文件,"last access date" 可能仍需要更新,因此 会导致写入 。这是否属实取决于;考虑:

  • 文件所在的文件系统是否支持最后访问时间?
  • 文件系统是否配置为使用它? (例如,Linux 有一个 noatime 属性,表示访问时间未更新)
  • 文件系统是只读的吗? (同样,Linux 是一个很好的例子;您可以将 FS 挂载为只读)

如果有可以写入的访问时间,下一个大问题是手边的 FS 是否有日志元数据? "journal" 是许多 FS 用来防止损坏的数据结构。如果答案是 "no",那么我会说 "yes, it is possible."

可以想象,损坏文件元数据会使文件本身中的数据损坏。 (更有可能的是,存储文件在磁盘上的位置的元数据可能靠近访问时间的位置;这可能会导致数据本身损坏。文件内容可能没问题,但说明它们所在位置的是什么腐败了。)

归根结底,如果您需要防范此类事情,

  1. 使用记录元数据的文件系统。 (例如,ext3,可以做到这一点。)请注意,一些带有日志 的 FS 没有 日志元数据。 (它们只记录主要文件数据。)(另请注意,有些可以通过任何一种方式进行配置。)
  2. 永远有备份。磁盘总是会彻底失败。

你的文件数据应该是安全的,但你应该知道一些文件系统会修改文件元数据中的access time,即使你'我们只是读取文件,即使分区以只读方式挂载。但是,如果您担心可能会禁用该功能 - 在类 Unix 系统上,您可以使用 noatime 选项挂载分区。有关详细信息,请参阅 mountfstab 的手册页。

但如果您使用的是现代 journaling file system,则真的没有必要太担心这一点。