115

Windowsフォームアプリケーションを使用してディレクトリを監視し、そこにドロップされたファイルを別のディレクトリに移動しています。

現時点では、ファイルを別のディレクトリにコピーしますが、別のファイルを追加すると、エラーメッセージなしで終了します。3番目で終了する前に2つのファイルをコピーする場合があります。

これは、コンソールアプリではなくWindowsフォームアプリケーションを使用しているためですか?プログラムの終了を停止し、ディレクトリを監視し続ける方法はありますか?

private void watch()
{
  this.watcher = new FileSystemWatcher();
  watcher.Path = path;
  watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite
                         | NotifyFilters.FileName | NotifyFilters.DirectoryName;
  watcher.Filter = "*.*";
  watcher.Changed += OnChanged;
  watcher.EnableRaisingEvents = true;
}

private void OnChanged(object source, FileSystemEventArgs e)
{
  //Copies file to another directory.
}

public void Dispose()
{
  // avoiding resource leak
  watcher.Changed -= OnChanged;
  this.watcher.Dispose();
}
4

3 に答える 3

158

問題は通知フィルターでした。プログラムは、まだコピー中のファイルを開こうとしていました。LastWriteを除くすべての通知フィルターを削除しました。

private void watch()
{
  FileSystemWatcher watcher = new FileSystemWatcher();
  watcher.Path = path;
  watcher.NotifyFilter = NotifyFilters.LastWrite;
  watcher.Filter = "*.*";
  watcher.Changed += new FileSystemEventHandler(OnChanged);
  watcher.EnableRaisingEvents = true;
}
于 2013-03-06T15:40:04.683 に答える
33

あなたはファイル処理コードを提供しませんでしたが、最初にそのようなことを書いたときに誰もが同じ間違いを犯したと思います。ファイルが作成されるとすぐにfilewatcherイベントが発生します。ただし、ファイルが完成するまでには少し時間がかかります。たとえば、1GBのファイルサイズを考えてみましょう。ファイルは別のプログラム(Explorer.exeがどこかからコピーする)によって作成される場合がありますが、そのプロセスが完了するまでに数分かかります。イベントは作成時に発生し、ファイルをコピーする準備ができるまで待つ必要があります。

この関数をループで使用することにより、ファイルの準備ができるのを待つことができます。

于 2013-02-22T06:18:14.123 に答える
27

その理由は、ウォッチャーがメソッドのローカル変数として宣言されており、メソッドの終了時にガベージコレクションされているためである可能性があります。クラスメンバーとして宣言する必要があります。次のことを試してください。

FileSystemWatcher watcher;

private void watch()
{
  watcher = new FileSystemWatcher();
  watcher.Path = path;
  watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite
                         | NotifyFilters.FileName | NotifyFilters.DirectoryName;
  watcher.Filter = "*.*";
  watcher.Changed += new FileSystemEventHandler(OnChanged);
  watcher.EnableRaisingEvents = true;
}

private void OnChanged(object source, FileSystemEventArgs e)
{
  //Copies file to another directory.
}
于 2013-02-22T06:18:58.877 に答える