いくつかの回避策はありますが、本物に問題を提起したかったのです。
/uploadフォルダーにファイルをアップロードする外部サーバーがあり、java.nio.file.Filesアトミックムーブを使用してそれらを/destフォルダーにコピーし、移動したファイルを処理しています。
問題は、nio move の呼び出し後、ソース ファイルがまだソースにフラッシュされていないことは明らかですが、ムーブはアトミックに実行され、フラッシュされると、宛先のムーブ ファイルにフラッシュされます。
OSはUbuntuです。擬似は次のとおりです。
Path origFilePath = resolveOrigFilePath();
Path targetFilePath = resolveOrigFilePath();
//ロギングは、ソース内の空のファイルを示します。長さ = 0
logger.warn("Atomic move file [{}], can read mode: [{}],can write mode: [{}] source size: [{}]",
origFilePath, origFilePath.toFile().canRead(), origFilePath.toFile().canWrite(), origFilePath
.toFile().length());
//ファイルのアトミックムーブを実行
Path target = Files.move(origFilePath, targetFilePath, StandardCopyOption.ATOMIC_MOVE);
//ロギングは空のファイルが移動されたことを示し、元のファイルはもう存在しません
logger.warn(
"Atomic moved file [{}] to [{}], target read mode: [{}], target write mode: [{}], target size: [{}], orig target size: [{}], is original exists [{}]",
origFilePath, target, target.toFile().canWrite(), target.toFile().canRead(),
target.toFile().length(), targetPath.toFile().length(), sensorFilePath.toFile().exists());
. . //まだ空の宛先ファイルを処理しています。. //しばらくすると、宛先ファイルにコンテンツが含まれますが、ファイルへの他のプログラムによるアクセスは行われません
. .
基礎となる実装の理由は何ですか?