![为什么 Debian 更喜欢用临时文件替换原始文件而不是修改原始文件中的字节?](https://linux22.com/image/58746/%E4%B8%BA%E4%BB%80%E4%B9%88%20Debian%20%E6%9B%B4%E5%96%9C%E6%AC%A2%E7%94%A8%E4%B8%B4%E6%97%B6%E6%96%87%E4%BB%B6%E6%9B%BF%E6%8D%A2%E5%8E%9F%E5%A7%8B%E6%96%87%E4%BB%B6%E8%80%8C%E4%B8%8D%E6%98%AF%E4%BF%AE%E6%94%B9%E5%8E%9F%E5%A7%8B%E6%96%87%E4%BB%B6%E4%B8%AD%E7%9A%84%E5%AD%97%E8%8A%82%EF%BC%9F.png)
在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
你应该绝不曾经修改过文件。写入文件的唯一安全方法是:
- 如果您是第一个创建该文件的人 (
O_EXCL
)。 - 通过写入新的临时文件,然后执行(原子)
rename(2)
. - 以仅追加模式 ( ) 打开文件
O_APPEND
。
否则,你将要总是会丢失数据,无论是当您的程序崩溃时(不要撒谎说您的程序是完美的)还是当您断电时。
有很多主要应用程序还没有了解这些规则;我责怪这样一个事实:甚至是以写截断模式打开文件的选项(因为它根本没有用)。
答案3
就地更改文件并不总是那么容易。
如果在文件中间添加日期,大小将会增加,并且更改后的所有数据都必须写入新位置。如果您首先在文件中间写入数据,则必须存储旧数据才能移动它,并希望不会在该过程中间崩溃。将结果写入新文件要容易得多。
写入新文件(然后将其替换为原始文件)还有一个优点,即任何访问旧文件的进程都能够不受干扰地继续其工作。如果您在该文件中移动内容,这样的过程可能会变得相当混乱。