2012-02-07 11 views
7

ファイルをコピーするフォルダがあります。私はそれを見て、ディレクトリにコピーされるとすぐにファイルを処理したい。ポーリング(私の現在の実装)か、オンラインで見つけたいくつかのサンプルからのWindows APIを使用したいくつかのテストで、ファイルがディレクトリにあるときを検出できます。C++ディレクトリウォッチング - コピーの検出方法が終了しました。

問題は、ファイルが最初に作成され、まだコピーされていることを検出することです。これにより、(ファイルがまだ完成していないために)エラーによってファイルにアクセスする必要があるプログラムが作成されます。コピーはいつ開始したのですか?私はWindows上でC++を使用していますので、答えはプラットフォームに依存するかもしれませんが、可能であれば、プラットフォームにとらわれない方がよいでしょう。

+0

私はほんの数分前にこの質問を見つけました:http://stackoverflow.com/questions/559659/how-to-know-a-file-is-finished-copyingは、それは私の問題に非常によく似ていますが、「承認"ソリューションはエレガントで機能的ではありません。 – petersaints

+0

コードが管理コンテキスト、つまりシステムサービスとして実行される場合は、変更ジャーナルを使用できます。 http://msdn.microsoft.com/en-us/library/windows/desktop/aa363798%28v=vs.85%29.aspx –

+0

'fread()'/'fwrite()を使用した簡単なコピーの可能性を考えると、 () '私は一般的な解決策はないと思う。非常に堅牢ではありませんが、おそらくオープンハンドルをファイルに追跡することによってですか? –

答えて

4

ロックファイルまたは特別な命名規則を使用できます。

「fileA.txt」という名前のファイルを移動したいとします。それをコピー先のディレクトリにコピーする場合は、「fileA.txt.partial」にコピーします。または、次のように動作します。そんな感じ。コピーが完了したら、ファイルの名前を "fileA.txt.partial"から "fileA.txt"に変更します。したがって、 "fileA.txt"の外観は、見ているプログラムが見ることができる限り原子的です。

前述の他のオプションはロックファイルです。したがって、 "fileA.txt"という名前のファイルをコピーするときは、まず "fileA.txt.lock"というファイルを作成します。コピーが完了したら、ロックファイルを削除するだけです。監視プログラムが "fileA.txt"を見ると、 "fileA.txt.lock"が存在するかどうかをチェックしなければなりませんが、必要に応じて将来そのファイルを待つか、再訪することができます。

+2

これは回避策であり、他の環境でも動作する可能性があります。しかし、この場合、私は他のプログラムによってコピーされているファイル/ファイルエクスプローラを経由して私のプログラムが見ているフォルダにファイルをコピーしているのです。その場合、このアプローチは非常に難しいです。 – petersaints

+0

ファイルのコピー方法を制御できない場合は、可能性があります。 ) そして、ええ、ポーリングが、私はもっと良いものに置き換えることをしようとしている良いアイデアではありませんので、 –

2

あなたは投票しないでください。 FindFirstChangeNotification(http://msdn.microsoft.com/en-us/library/windows/desktop/aa364417%28v=vs.85%29.aspx)を使用して、変更のディレクトリを監視します。

次に、変更通知が発生するのを待つために、待機機能(http://msdn.microsoft.com/en-us/library/windows/desktop/ms687069%28v=vs.85%29.aspx)を使用します。ここ

概要と例:http://msdn.microsoft.com/en-us/library/windows/desktop/aa365261%28v=vs.85%29.aspx

私は正確に書き込み完了を判断することができるファイルかどうかはわかりません。 Evan Teranの答えは良い考えです。

+0

それはまさにです!私はそれらの方法を見つけました。私はすでにこれに基づいた解決策を持っています:http://code.google.com/p/simplefilewatcher/。問題は、ファイルの書き込み完了を判断することです。 (私はすでに若干変更されていること)、そのライブラリは、私はそれがさらに強力FindFirstChangeNotification以上だと信じていることをReadDirectoryChangesWを使用しています。 – petersaints

+0

メモでは、私はDropbox(この例では)がこの種の問題をどのように扱うのか疑問に思っています。 – petersaints

+0

排他書き込みのためにファイルを開こうとすると、コピーが完了するまで失敗します。それをポーリングするのではなく、その状態をブロックする方法はおそらくありますが、それはわかりません。 –

関連する問題