2011-01-11 8 views
2

私は、ローカルファイルシステムディレクトリにFsWatcherをセットアップしました。私は、ファイルがディレクトリにいつ追加されるのかを知りたいので、別のファイルシステムに移動することができます。私は、最初のファイルが入っている時を検出することができるようですが、実際には、特定のコピー操作からのすべてのファイルがいつ完了したかを知りたいと思います。FileSystemWatcher作業は完了しましたか?

Windowsエクスプローラを使用して1つのディレクトリから別のディレクトリにファイルをコピーした場合、エクスプローラは転送にn秒が残っていると教えてくれるので、各ファイルの開始転送と終了転送のアクティビティ、すべてのファイルの開始転送と終了転送に何かがあるように見えます。

.NET Frameworkだけでできることが類似しているのだろうかと思います。私は "すべての"ファイルが "トランザクション"の単一のファイルではなく、いつ入っているか知りたいと思います。焼かれたものがなければ、たぶん仕事が「完了」したときに私の活動だけをするために何らかの待っている/対抗する必要があるかもしれません。

私はこれについて100%の感覚を作っているのかどうかは分かりませんが、誰でもコメントしてください。

ありがとうございました。

+0

私には意味があります。ファイルのグループをディレクトリにコピーする場合、各ファイルをディレクトリにコピーしたまま処理する必要はありません。アクションを実行する前に、グループ内のすべてのファイルがコピーされるまで待つ必要があります。 – Tester101

答えて

3

これまで私がこれを実装してきた方法は、特別な名前の「マーカー」ファイルを用意することです。 '終わり'。このファイルは常に最後に書き込まれたファイルであり、マルチファイルトランザクションがいつ完了するかの指標となります。これらのファイルセットを書き込んでいるスレッドが1つしかない場合、これはうまく動作します。

複数のスレッドがあり、それぞれが一連のファイルを書き込んでいる場合は、それぞれの「終了」ファイルと、それがマーキングしているファイルのセットを何らかの形で関連付ける必要があります。これを行う1つの方法は、ファイル名にGUID(またはその他の一意の識別子)を含めることです。

{GUID1 .file1.bin、GUID1 .file2.bin、GUID1 .END}

{GUID2 .file1.bin、GUID2 .file2.bin、GUID2 .end}

別の方法として、各セットのすべてのファイルを1つのZIPファイルに圧縮して、1つのファイルのみを監視する必要があります。

1

ファイルコピーのトランザクションなどはありません。ディレクトリ内の単一ファイルの変更のみを監視できます。

エクスプローラは、実行したいことが分かっているので、これを実行できます(これらのxファイルをここにコピーします)。

このファイルを書き込む(またはより一般的には変更する)ときには、わからないことがあります。ファイルにアクセスするのは唯一のファイルなので、ファイルを排他的にロックしようとする必要があります。

AdamRalphが言及している.endファイルのトリックは、あなたがしたいことに実際に近づく唯一のトリックです。

HTH

マリオ

0

その後、何の最初のステップとして追加されるファイルのリストを示すファイルを書くことについて、あなたのアプリケーションがそれを拾って、それを読み取り、書き込まれるファイルを待ちます。最終的なファイルが書き込まれたら、それらをパッケージ化して送信することができます。このように、複数の「トランザクション」が開始された場合は、「終了ファイル」が互いに足を踏み合わせることはありません。インジケータファイルに既知のパターン名を付けて、それが通常のファイルでは起こりそうにないことを探し、類似の時刻に複数のインジケータファイルが発生する可能性のある手段を提供します。

私がこのようなものを実装するなら、おそらく~<ANOTHER-UNIQUE-GUID>.tmpのような何らかのファイル名を使用するでしょう。私のファイルシステムウォッチャーはそのフォーマット名の1つのファイルを監視し、ファイルシステムウォッチャーがファイルを待つように指示します内部にリストされている。ファイルが移動されると、一時ファイルを削除することができます。

この種のアプローチでは、ウォッチャーのそれぞれがお互いに歩み回り、他のウォッチャーが作業しているファイルを転送/削除しないように簡単にスレッド化できます。

しかし、以前に示唆したように、ファイルを単一のアーカイブに圧縮して使用し、そのファイルをコピー先でアンパッケージする方が効果的かもしれません。

+1

あなたは複数の書き込みスレッドの可能性について良い点を作っています。私は、これに対処するための提案で、私の答えを更新しました。あなたの提案は間違いなく機能しますが、私は実際にマーカーファイルを開いてその内容を読む必要はありません。不完全なセットが提供されている途中で、失敗の可能性の半分を処理しなければならず、コンポーネントが不完全なセットを待っていないようにタイムアウトを設定する必要があります。 'end'解決策では、 'end'ファイルがそこに来るまでフォルダ内のファイルは気にしません。 –

+0

@AdamRalphあなたは公正な点を – BenAlabaster

+0

@AdamRalphにするか、マーカーファイルで始めるのではなく、完了したファイルを 'GUID1.end'ファイルに入れてください。 .endファイルが書き込まれると、ファイルは正常にコピーされ、ファイル名のすべてにGUIDを付加することなく、.endファイルからファイルのリストを取得できます。 – BenAlabaster

関連する問題