web-dev-qa-db-ja.com

FTPを使用してサーバー上でファイルが完全であるかどうかを知る方法は?

FTPを使用してサーバー上のディレクトリをスキャンし続けるJavaのファイルスキャナーアプリケーションがあります。ディレクトリのファイルのリストを取得し、1つずつダウンロードします。一方、サーバーには、これらのファイルを書き込むプロセスがあります。運が良ければ、不完全なファイルをダウンロードしようとはしませんが、サーバーでの書き込みプロセスが完了し、ファイルハンドルが閉じており、ファイルをダウンロードする準備ができていることを確認するにはどうすればよいですか?

サーバー上の書き込みプロセスを制御できません。さらに、すでに書き込みハンドルが開いているかどうかを確認するために書き込みハンドルを取得しようとするディレクトリに対する書き込み権限がないので、このオプションはオフになっています。

この問題に対処するFTP機能はありますか?

22
mostafa.S

これは非常に古く、よく知られている問題です。

FTPデーモンによって書き込まれているファイルが完全であることを確実に確認する方法はありません。ファイル転送が失敗し、再起動して完了する可能性もあります。ファイルのサイズをポーリングし、時間制限(たとえば5分)を設定する必要があります。その間にサイズが変わらない場合は、ファイルが完全であると想定します。

可能であれば、ファイルを処理するプログラムは部分ファイルを処理できる必要があります。

はるかに優れた代替手段は、rsyncです。これは、はるかに堅牢で確定的です。 (コマンドラインオプションを使用して)最初に一時的な場所にデータを書き込み、正常に完了したら最終的な宛先パスに移動するように構成することもできます。予期した場所にファイルが存在する場合、それは定義上完全です。

22
Jim Garrison

考えられる解決策は、最初に別のファイル名でファイルをアップロードし(たとえば、「。partial」を追加)、次にファイル名を最終的な名前に変更することです。

サーバーが最終的な名前を見つけた場合、アップロードは完了しています。

アップロードプロセスを制御できない場合、定義上、要求することは不可能です。ファイルのアップロードは、ネットワークの問題または何らかの理由で送信プロセスが停止したために停止する可能性があります。

受信側が観察するのは、着信ストリームのクローズだけです。データが部分的に転送されないことを保証する方法はありません。

他の回避策としては、データの終わりマーカーを確認するか、送信サーバーへのリクエストを使用して、転送が完了したかどうかを確認します。

12
6502

これはFTPよりも基本的なものです。ローカルマシンで作成されている場合でも、これらのファイルを読み取る場合と同様の問題が発生します。

書き込みプロセスを変更できない場合は、いくつかのフープをジャンプする必要があります。どれも素晴らしいものではありませんが、いくつかは他のものより安全です。

  • 一部のウィンドウで何も変更されなくなるまで読み続けます(David Schwartzが示唆するように、おそらく1分程度)。ファイルサイズを監視することで、これを少し最適化できます。
  • ファイルが信頼できる順序で連続して書き込まれているかどうかを確認します。ファイルNが表示されたら、ファイルN-1の準備ができていることがわかります。 (タイムスタンプを確認することもできますが、ファイルが書き込まれる前にディレクトリが空であると想定しています。)欠点は、ライターが順序を変更したり、並行して書き込みを開始したりすると、ロジックが壊れることです。

信頼性が高く安全なソリューションには、ライタープロセスの改善が必要です。

  • Writerは、ファイルを隠し場所または一時的な場所に書き込み、ファイル全体(またはディレクトリ)の準備ができたときにのみ、シンボリックリンクまたはファイル移動またはchmodを使用してファイルを表示できます。
  • Writerは、他のすべてのファイルが書き込まれた後にのみ特別なファイル(たとえば、「./ DONE」)を作成し、Readerはそのファイルが存在するまでファイルを読み取りません。
  • ファイルの種類に応じて、ライターはファイルの終わりにある種のファイル終了レコード/行を追加でき、リーダーはそれが存在することを確認できます。
7
dbort

Apache共通APIからFtpライブラリを使用できます 詳細情報を取得

 boolean flag = retrieveFile(String remote, OutputStream local);

このフラグチェック出力ストリームは、現在のファイルで使用できます。

0