为什么 Debian 更喜欢用临时文件替换原始文件而不是修改原始文件中的字节?

为什么 Debian 更喜欢用临时文件替换原始文件而不是修改原始文件中的字节?

mp3gain联机帮助页中,您可以阅读以下内容:

   -t        mp3gain  writes  modified  mp3  to  temp  file,  then deletes
             original instead of modifying bytes in original file (This is
             the default in Debian)

   -T        mp3gain modifies bytes in original file instead of writing to
             temp file.

大多数发行版(以及 Windows)都会更改一些字节(如果可能的话,我猜是在 mp3 的填充标签空间中)。这样做的另一个好处是速度更快。特别是在标记数千个文件时。这还有一个额外的好处,即仅将更改的集群同步到例如 Dropbox。

然而,Debian 将整个文件(包括更改的字节)重写为临时文件,然后用临时文件替换原始文件。

我想知道这到底是为什么。我想从了解这一事实的人那里了解真正的原因。 (你可以自由地做出有根据的猜测,但我可能会推迟接受你的答案,直到我得到更多答案。)

答案1

您的问题表明 Debian 使用临时文件进行所有写入,但事实并非如此。这只是 的默认设置mp3gain

在版本 1.4.3-2 中,软件包维护者 (Stefan Fritsch) 决定,由于在 ReiserFS 上写入临时文件要快得多,因此这将是 Debian 上的默认设置。这是源自于修补https://packages.debian.org/source/squeeze/mp3gain

其他发行版上的软件包维护者可能不同意 Stefan 的观点,因此没有更改不使用临时文件的默认设置。

答案2

你应该绝不曾经修改过文件。写入文件的唯一安全方法是:

  1. 如果您是第一个创建该文件的人 ( O_EXCL)。
  2. 通过写入新的临时文件,然后执行(原子)rename(2).
  3. 以仅追加模式 ( ) 打开文件O_APPEND

否则,你将要总是会丢失数据,无论是当您的程序崩溃时(不要撒谎说您的程序是完美的)还是当您断电时。

有很多主要应用程序还没有了解这些规则;我责怪这样一个事实:甚至以写截断模式打开文件的选项(因为它根本没有用)。

答案3

就地更改文件并不总是那么容易。

如果在文件中间添加日期,大小将会增加,并且更改后的所有数据都必须写入新位置。如果您首先在文件中间写入数据,则必须存储旧数据才能移动它,并希望不会在该过程中间崩溃。将结果写入新文件要容易得多。

写入新文件(然后将其替换为原始文件)还有一个优点,即任何访问旧文件的进程都能够不受干扰地继续其工作。如果您在该文件中移动内容,这样的过程可能会变得相当混乱。

相关内容