2013-02-22 9 views
59

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

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

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

private void watch() 
{ 
    FileSystemWatcher 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. 
} 

答えて

85

問題は通知フィルターでした。プログラムはまだコピーしていたファイルを開こうとしていました。 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; 
} 
20

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

ループ内でthis機能を使用すると、ファイルの準備ができるまで待つことができます。

14

ウォッチャーはメソッドのローカル変数として宣言され、メソッドが終了するとガベージコレクションされることがあります。クラスメンバーとして宣言する必要があります。以下を試してください:

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. 
} 
+9

'watcher'変数は、Changedイベントを購読しているので、生きている(ガベージコレクションされません)。 – adospace

関連する問題