![如果用相同的内容重新写入文件,修改时间会改变吗?](https://linux22.com/image/9603/%E5%A6%82%E6%9E%9C%E7%94%A8%E7%9B%B8%E5%90%8C%E7%9A%84%E5%86%85%E5%AE%B9%E9%87%8D%E6%96%B0%E5%86%99%E5%85%A5%E6%96%87%E4%BB%B6%EF%BC%8C%E4%BF%AE%E6%94%B9%E6%97%B6%E9%97%B4%E4%BC%9A%E6%94%B9%E5%8F%98%E5%90%97%EF%BC%9F.png)
我有一个由 Java 程序定期写入的文件。
如果用一模一样的内容重新写入,文件修改时间会改变吗?
似乎并非如此;这让我感到惊讶 - 我不认为有任何东西会根据新内容检查旧内容。
哎呀,意识到如果内容没有改变,Java 程序就不会写入文件。我的错。但很高兴得到明确的答案。
答案1
是的,修改时间会改变。你可以自己看看这个:
echo Hello > test
stat test
sleep 2
echo Hello > test
stat test
第二个stat
将显示与第一个相同的访问时间(这证明文件没有被删除并重新创建 - 这当然符合 所需的行为>
),但更新了修改和更改时间。
这是 POSIX 指定的,例如在write()
:
成功完成后,在哪里字节大于0,写()应标记更新文件的最后一次数据修改和最后一次文件状态更改时间戳,如果文件是常规文件,则文件模式的S_ISUID和S_ISGID位可以被清除。
答案2
每次保存文件时,其修改时间都会发生变化。如果您在进行更改后保存文件或仅保存文件而不进行任何更改,则修改时间会发生变化。
如果时间没有改变,很可能文件没有被保存。当您再次重写相同的内容时,请尝试检查重写内容后文件是否已保存。
答案3
注意:这不是对你的问题的直接回答,而是对显而易见的后续问题的回答”如果我不能依赖时间戳,如何检测文件是否实际上已更改?”
如果您需要检查文件是否内容(不仅仅是它的时间戳)已经改变,您必须将当前内容与以前的内容进行比较。例如,在sh
:
与以下命令进行逐字节比较cmp
:
if [ -e "$oldcopy" ] && cmp -s "$oldcopy" "$currentcopy" ; then
# do whatever needs doing if the file hasn't changed
else
# first do whatever needs doing if the file is new or has changed
# then make a copy of the current file
cp -af "$currentcopy" "$oldcopy"
fi
使用校验和(又名散列又名消息摘要)md5sum
:
if [ -e "$filename.md5sum" ] && md5sum --status "$filename.md5sum)" ; then
# do whatever needs doing if the file hasn't changed
else
# first do whatever needs doing if the file is new or has changed
# then save an md5sum of the current file
md5sum "$filename" > "$filename.md5sum"
fi
md5sum
使用更多的 CPU 能力来生成文件的消息摘要。 cmp
使用更多磁盘空间来制作文件的第二个完整副本。
sha512
如果需要,可以使用任何其他摘要工具(例如)来代替md5sum
......如果文件不同,如果存在任何安全隐患,则可能应该使用。
Java 与许多其他语言一样,具有执行消息摘要计算的库。