FTPを使用してサーバー上のディレクトリをスキャンし続けるJavaのファイルスキャナーアプリケーションがあります。ディレクトリのファイルのリストを取得し、1つずつダウンロードします。一方、サーバーには、これらのファイルを書き込むプロセスがあります。運が良ければ、不完全なファイルをダウンロードしようとはしませんが、サーバーでの書き込みプロセスが完了し、ファイルハンドルが閉じており、ファイルをダウンロードする準備ができていることを確認するにはどうすればよいですか?
サーバー上の書き込みプロセスを制御できません。さらに、すでに書き込みハンドルが開いているかどうかを確認するために書き込みハンドルを取得しようとするディレクトリに対する書き込み権限がないので、このオプションはオフになっています。
この問題に対処するFTP機能はありますか?
これは非常に古く、よく知られている問題です。
FTPデーモンによって書き込まれているファイルが完全であることを確実に確認する方法はありません。ファイル転送が失敗し、再起動して完了する可能性もあります。ファイルのサイズをポーリングし、時間制限(たとえば5分)を設定する必要があります。その間にサイズが変わらない場合は、ファイルが完全であると想定します。
可能であれば、ファイルを処理するプログラムは部分ファイルを処理できる必要があります。
はるかに優れた代替手段は、rsyncです。これは、はるかに堅牢で確定的です。 (コマンドラインオプションを使用して)最初に一時的な場所にデータを書き込み、正常に完了したら最終的な宛先パスに移動するように構成することもできます。予期した場所にファイルが存在する場合、それは定義上完全です。
考えられる解決策は、最初に別のファイル名でファイルをアップロードし(たとえば、「。partial」を追加)、次にファイル名を最終的な名前に変更することです。
サーバーが最終的な名前を見つけた場合、アップロードは完了しています。
アップロードプロセスを制御できない場合、定義上、要求することは不可能です。ファイルのアップロードは、ネットワークの問題または何らかの理由で送信プロセスが停止したために停止する可能性があります。
受信側が観察するのは、着信ストリームのクローズだけです。データが部分的に転送されないことを保証する方法はありません。
他の回避策としては、データの終わりマーカーを確認するか、送信サーバーへのリクエストを使用して、転送が完了したかどうかを確認します。
これはFTPよりも基本的なものです。ローカルマシンで作成されている場合でも、これらのファイルを読み取る場合と同様の問題が発生します。
書き込みプロセスを変更できない場合は、いくつかのフープをジャンプする必要があります。どれも素晴らしいものではありませんが、いくつかは他のものより安全です。
信頼性が高く安全なソリューションには、ライタープロセスの改善が必要です。
Apache共通APIからFtpライブラリを使用できます 詳細情報を取得
boolean flag = retrieveFile(String remote, OutputStream local);
このフラグチェック出力ストリームは、現在のファイルで使用できます。