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にはメッセージダイジェスト計算を実行するライブラリがあります。