在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
就地更改文件并不总是那么容易。
如果在文件中间添加日期,大小将会增加,并且更改后的所有数据都必须写入新位置。如果您首先在文件中间写入数据,则必须存储旧数据才能移动它,并希望不会在该过程中间崩溃。将结果写入新文件要容易得多。
写入新文件(然后将其替换为原始文件)还有一个优点,即任何访问旧文件的进程都能够不受干扰地继续其工作。如果您在该文件中移动内容,这样的过程可能会变得相当混乱。