2011-12-23 10 views
3

新しいファイルのためにファイルシステムをポーリングしています。 新しいファイルをすべて処理する必要がありますが、その前に、私が処理しているファイルが完全であることを保証したい(私はそれが完全にWebインターフェイス経由で転送されていると言っています)。Javaファイルを取得する前に、ファイルが完了しているかどうかを確認してください。オブジェクト

処理前にファイルのダウンロードが完了したかどうかを確認するにはどうすればよいですか?

+1

ファイルがディスクに保存される方法によって異なります。 – SLaks

+0

あなたはどのオペレーティングシステムを使用していますか? – Jhonathan

答えて

8

ファイル名の名前を変更することは、ほとんどの(すべてではないにしろ)ファイルシステムのアトミックアクションです。これを利用するには、ファイルを認識可能な一時的な名前にアップロードし、アップロードが完了するとすぐに名前を変更します。

この方法では、完全にアップロードされ、処理に安全なファイルのみが表示されます。

+0

リネームを使用してかなり面白いハックの+1。 – ArjunShankar

+2

これは本当にハックではありません。アップロードプロセスがファイルをロックしていないか、ファイルにファイルの終わりがわかるマーカーがある場合を除き、これはこれを行うための唯一の方法であり、標準的な方法です。 firefoxなどのブラウザでさえ、同じことをします(隠された* .partファイルを作成してから、期待されるターゲットファイルに名前を変更します)。 –

+0

標準的な練習であろうとなかろうと、それを行う別の方法があるかどうか、これらはすべて、ハックであるかどうかとは関係ありません。これはハックです。なぜなら、ハッキングのない方法は、オペレーティングシステムに「このファイルは誰か他の人が開いていますか?」と尋ねることだからです。それにもかかわらず、間違いなく良いハックのケースです。 –

2

rspの回答は非常に良いです。万一、それがうまく動作せず、ファイルを保存しているWebサーバーのプロセスとは異なるプロセスでポーリングコードが実行されている場合は、次を試してみてください。

通常ファイルが保存されているときに、共有オプションは「誰にでも読めるようにする」と「誰にも書き込まない」を許可します。したがって、あなたは排他的な書き込みアクセスでもファイルを開こうとすることができます。これが失敗すると、Webサーバーはまだファイルを開いたままにして書き込みます。それが成功すると、Webサーバーが完了したことがわかります。もちろん、Webサーバーがファイルをロックする方法を正確には保証できないため、必ず試してください。

+0

私はLinuxシステムを使用しています。私は簡単な実験を行っている、私はダウンロード完了していない1つのファイルのFileオブジェクトを作成しようとしました、Javaを介してファイルを処理することができました。私が望むのは、ファイルにアクセスして処理する前に、ファイルが完全にダウンロードされたかどうかをチェックする方法です。私が間違っている場合は、私が直面している実際のケースでトレントファイルケースをシミュレートしようとしています。私のプロジェクトでは、3人目の人が大きなpdfファイルをアップロードするので、それらを処理する前に、そのファイルが私のサーバーに完全にアップロードされていることを確認したかっただけです。 – dhroove

+0

まあ、排他的な書き込みでファイルを開こうとすると成功した場合、これはあなたのトレントクライアントが排他的な書き込みで同じファイルを開かないことを意味します。これは、Webサーバーが同じように動作することを意味するものではありません。あなたのWebサーバー上で成功する可能性があります。 –

関連する問題