同じ内容でファイルを再作成すると、変更時間が変わりますか?

同じ内容でファイルを再作成すると、変更時間が変わりますか?

Javaプログラムによって定期的に記録されるファイルがあります。
同じ内容で書き換えると、ファイルの変更時間が変わりますか?
そうではないようです。驚くべきことに、新しいコンテンツと既存のコンテンツを比較する方法はありません。

このように、内容が変更されないと、Javaプログラムがファイルに書き込まないことに気づきました。私のせい。しかし、明快な答えを得ることができて嬉しい。

答え1

はい、修正時間が変更されます。自分で確認してください。

echo Hello > test
stat test
sleep 2
echo Hello > test
stat test

2つ目は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ファイルの 2 番目の完全なコピーを作成するには、より多くのディスク領域を使用します。

sha512必要に応じて、他のサマリーツール(たとえば)を代わりに使用できますmd5sum。ファイルが異なる場合にセキュリティに影響を与える場合は、それを使用する必要があります。

他の多くの言語と同様に、Javaにはメッセージダイジェスト計算を実行するライブラリがあります。

関連情報