3

プロジェクトには、作業フォルダーがあります。ファイルまたはファイルのフォルダーをどこかからこのフォルダーにコピーする場合、コピーが完了したかどうかを検出する必要があります。その後、この作業フォルダー内のファイルを処理します。

FileSystemWatcher theWatcher = new FileSystemWatcher(workingFolder);
theWatcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite |
                          NotifyFilters.FileName | NotifyFilters.DirectoryName |
                          NotifyFilters.Size;
theWatcher.IncludeSubdirectories = true;
theWatcher.Created += OnFolderChanged;
theWatcher.EnableRaisingEvents = true;

ファイルがコピーされるたびに、OnFolderChanged イベントがトリガーされます。そのため、最初は2つのファイルのコピー間の日食時間を取得しようとしましたが、ネットワーク速度とファイルサイズのために日食時間を決定するのは非常に困難です. また、 Directory で Copy プロセスが進行中の場合は Findでメソッドを試しましたが、コピーが進行中の場合でもトークン ファイルを開くことができます。

これを処理する良い方法はありますか?

4

2 に答える 2

2

FileSystemWatcher を使用して、何も知らないプロセスの操作をリバース エンジニアリングすることはできません。考えられる故障モードは多数あります。ユーザーがエクスプローラーを使用してファイルをコピーすると、目的のファイルが既に存在するため、ダイアログが表示されるのが良い例です。ユーザーはしばらく時間がかかることを期待していたので、トイレ休憩を取っていました。

何が起こっているかについて、決して仮定を立てるべきではありません。任意に、通知を受け取ったら 1 分間のタイマーを開始し、別の通知を受け取ったら再開します。タイマーが刻むと、コピー操作が完了したと推測する何らかの理由があります。推測が間違っていたとしても、それが問題にならないことを確認してください。

于 2013-02-01T15:40:57.987 に答える
0

ファイル/フォルダーをコピーするプロセスを制御できる場合-コピーが完了したときにファイル/フォルダーにサフィックス(.complete)を追加し、ファイルシステムウォッチャーを設定して、 .complete拡張子。

更新-コピーされたファイル/フォルダー名を制御できないため-FolderChagedメソッドで例外処理を使用します。そのメソッドでファイル/フォルダーを使用して何らかの処理を行っていると仮定します。コピーが完了していないファイル/フォルダーにアクセスしようとすると、なんらかのSystem.IO例外が発生します。

FSWでもこの問題が発生しました。例外をキャッチし、数秒間一時停止してから、ファイルへのアクセスを再試行することで問題を処理しました。このロジックをループに入れて、10秒間に5回ファイルへのアクセスを再試行します。5回試行してもファイルを処理できない場合は、例外をスローし、標準のエラー処理が引き継ぎます。

もちろん、それはあなたにとって適切なループパラメータが何であるかという未解決の問題であり、それらのパラメータの限界に達した場合、どのように失敗を処理しますか?

于 2013-01-31T21:51:45.240 に答える