何らかの理由で、私の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));
}
}
セットアップメソッドでローカル変数としてFileSystemWatcherを作成しているようです。もちろん、これはメソッドの最後で範囲外になり、その時点で片付けられる可能性が高いため、時計を削除します。
FSWが永続化される時点(プログラムレベルの変数など)でFSWを作成してみて、問題が解決するかどうかを確認してください。
私の問題は、FileSystemWatcher
Changed
イベントを発生させる特定のアクションを期待していたことでした。たとえば、ファイルをデスクトップから監視された場所に移動(クリックしてドラッグ)してもイベントは発生しませんでしたが、既存のファイルをコピーしてその新しいコピーを貼り付けます(新しいファイルをファイルシステムに作成するだけでなく、既存のもの)がChanged
イベントを発生させました。
私の解決策は、すべてのNotifyFilter
をFileSystemWatcher
に追加することでした。このようにして、FileSystemWatcher
が通知できるすべての場合に通知されます。
[〜#〜] note [〜#〜]特定のケースについてどのフィルタが通知するかについては、完全に直観的/明白ではないことを確認してください。たとえば、FileName
を含めた場合、既存のファイルの名前が変更された場合に通知されることを期待していました...代わりにAttributes
がそのケースを処理するようです。
watcher.NotifyFilter = NotifyFilters.Attributes |
NotifyFilters.CreationTime |
NotifyFilters.FileName |
NotifyFilters.LastAccess |
NotifyFilters.LastWrite |
NotifyFilters.Size |
NotifyFilters.Security;
このセッターを使用してトリガーを有効にします。
watcher.EnableRaisingEvents = true;