为什么文本编辑器在未进行任何更改的情况下设置保存时的修改时间?

为什么文本编辑器在未进行任何更改的情况下设置保存时的修改时间?

当我使用 sublime 时,并且没有进行任何更改,则编辑器中的图标显示文件未更改。

但是,如果我单击保存它,它仍然将文件系统 mtime 时间设置为现在。

不变的保存真的应该更新“修改”时间吗?


简单的例子:

创建一个空文件

$ touch example.file
$ stat -l example.file 
-rw-r--r-- 1 matthew staff 0 Jul  9 14:45:41 2013 example.file

触摸它会更新 mtime

$ touch example.file
$ stat -l example.file
-rw-r--r-- 1 matthew staff 0 Jul  9 14:45:57 2013 example.file

编辑它,但不做任何更改,也会更新 mtime

$ vim example.file
# :wq # write and quit, making no changes
$ stat -l example.file
-rw-r--r-- 1 matthew staff 0 Jul  9 14:46:10 2013 example.file

答案1

不变的保存真的应该更新“修改”时间吗?

是的,因为当应用程序写出文件时,操作系统会将该数据写入磁盘。它可能与文件中已有的数据完全相同,但操作系统不会检查或关心这是否属实。当然,文本编辑器希望不会天真地为每次保存写入整个文件,因为我保存非常频繁,并且不希望毫无意义地磨损磁盘(也许操作系统的文件缓存和同步可以改善这一点,因此应用程序不会不得不担心)。

许多应用程序(包括 vim)会注意到它们加载的文件是否在外部发生更改,并通知用户。我本以为他们是基于 mtime 来做到这一点的,但是快速检查touch表明至少在 vim 的情况下,事情并不是那么简单(引出 vim 如何知道已进行更改的问题 - 也许如果 mtime 已更改)比较两个版本的哈希值?)。我的观点是,如果应用程序正在监视文件的外部更改,那么它应该能够安全地保存更改,而无需重写整个文件(再次:希望如此)。在这种情况下,您可能会认为保存未更改的文件可能意味着什么也不做。然而,由于用户确实要求保存(即使用户知道或可以知道是否有必要),那么在我看来,应用程序至少应该触摸文件以反映这一点。如果,例如,它可能是有价值的。您依赖时间戳来反映上次更新,即使此更新毫无意义。

毕竟,如果你如果想要更改时间戳,则不必保存未更改的文档。

相关内容