0

このディレクトリにファイルをコピーするときに Created イベントをリッスンする FileSystemWatcher を使用しています。この方法は以下のとおりです。

private void fileSystemWatcher1_Created(object sender, System.IO.FileSystemEventArgs e)
{
   System.IO.Directory.Move(fileSystemWatcher1.Path+@"\"+e.Name, fileSystemWatcher1.Path + @"\Processing\"+e.Name);
}

問題は、コピーに約 30 秒かかるような大きなファイルをこのディレクトリにコピーすると、最初のバイトがフォルダに書き込まれるとすぐにこのメソッドが呼び出され、別のファイルによって使用されているファイルを移動しようとすることです。プロセスは失敗します。

何かご意見は?

ありがとう

4

4 に答える 4

3

これを機能させるには、いくつかのソリューションを組み合わせる必要がある場合があります。

  1. イベントが発生すると、しばらく (30 秒?) 待機するタイマーが開始され、ファイルの作成が完了するまでの時間が確保されます。次に、ファイルを移動します。

  2. エラーをトラップして、後で再試行してください。

または、ファイルが到着したら、その名前をキューに追加してから、ファイルをキューから移動する別のプロセスを用意します。この場合、「ファイルが使用中です」というエラーが発生した場合は、単純にファイルをキューの最後に読み込み、完了するまでの時間を増やすことができます。

于 2010-10-23T17:20:28.980 に答える
2

このような場合、ウォッチャーに認識されない一時的なファイル名を使用して、コピー プロセスでファイルを移動させるのが好きです。

次に、ファイルの名前を実際の名前に変更します。名前の変更にはほとんど時間がかからず、ファイルが「使用中」になることもありません。

于 2010-10-23T17:19:09.410 に答える
1

私はこれをしました:

while(true){
  try
  {
     using (Stream stream = new FileStream("MyFilename.txt"))
     {
        break;
     }
  } catch {
     Thread.Sleep(1000);
  }
}

それは仕事をするようです

于 2010-10-23T17:50:21.457 に答える
1

おそらく、「Changed」イベントもリッスンすることでこれを行うことができ、クールオフ期間の後にのみファイルのコピーを試みることができます。つまり、「Created」を受け取った後、5 秒待ってからファイルをコピーし、Changed イベントを受け取るたびに時間をゼロにリセットします。

于 2010-10-23T17:20:32.997 に答える