web-dev-qa-db-ja.com

FileSystemWatcherがイベントを発生させない

何らかの理由で、私のFileSystemWatcherはイベントをまったく発生させません。ディレクトリで新しいファイルが作成、削除、または名前が変更されたときはいつでも知りたい。 _myFolderPathが正しく設定されていることを確認しました。

これが私の現在のコードです:

public void Setup() {
    var fileSystemWatcher = new FileSystemWatcher(_myFolderPath);
    fileSystemWatcher.NotifyFilter = NotifyFilters.LastAccess | 
      NotifyFilters.LastWrite | NotifyFilters.FileName | NotifyFilters.DirectoryName;

    fileSystemWatcher.Changed += FileSystemWatcherChanged;
    fileSystemWatcher.Created += FileSystemWatcherChanged;
    fileSystemWatcher.Deleted += FileSystemWatcherChanged;
    fileSystemWatcher.Renamed += FileSystemWatcherChanged;

    fileSystemWatcher.Filter = "*.*";
    fileSystemWatcher.EnableRaisingEvents = true;
}

private void FileSystemWatcherChanged(object sender, FileSystemEventArgs e)
{
    MessageBox.Show("Queue changed");
    listBoxQueuedForms.Items.Clear();
    foreach (var fileInfo in Directory.GetFiles(_myFolderPath, "*.*", SearchOption.TopDirectoryOnly))
    {
        listBoxQueuedForms.Items.Add(fileInfo));
    }
}
27
gwin003

セットアップメソッドでローカル変数としてFileSystemWatcherを作成しているようです。もちろん、これはメソッドの最後で範囲外になり、その時点で片付けられる可能性が高いため、時計を削除します。

FSWが永続化される時点(プログラムレベルの変数など)でFSWを作成してみて、問題が解決するかどうかを確認してください。

24
Chris

私の問題は、FileSystemWatcherChangedイベントを発生させる特定のアクションを期待していたことでした。たとえば、ファイルをデスクトップから監視された場所に移動(クリックしてドラッグ)してもイベントは発生しませんでしたが、既存のファイルをコピーしてその新しいコピーを貼り付けます(新しいファイルをファイルシステムに作成するだけでなく、既存のもの)がChangedイベントを発生させました。

私の解決策は、すべてのNotifyFilterFileSystemWatcherに追加することでした。このようにして、FileSystemWatcherが通知できるすべての場合に通知されます。

[〜#〜] note [〜#〜]特定のケースについてどのフィルタが通知するかについては、完全に直観的/明白ではないことを確認してください。たとえば、FileNameを含めた場合、既存のファイルの名前が変更された場合に通知されることを期待していました...代わりにAttributesがそのケースを処理するようです。

watcher.NotifyFilter = NotifyFilters.Attributes |
    NotifyFilters.CreationTime |
    NotifyFilters.FileName |
    NotifyFilters.LastAccess |
    NotifyFilters.LastWrite |
    NotifyFilters.Size |
    NotifyFilters.Security;
24
MoMo

このセッターを使用してトリガーを有効にします。

watcher.EnableRaisingEvents = true;
9
Luca Ziegler