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));
}
}
Ответы
Ответ 1
Кажется, вы создаете FileSystemWatcher как локальную переменную в методе установки. Это, конечно же, выходит из сферы действия в конце метода и вполне может быть убрано в этот момент, тем самым удаляя часы.
Попробуйте создать FSW в том месте, где оно будет сохраняться (например, переменная уровня программы) и посмотреть, не сортирует ли вы это.
Ответ 2
Моя проблема заключалась в том, что я ожидал определенных действий, чтобы вызвать пожар события FileSystemWatcher
Changed
. Например, перемещение файла (щелчка и перетаскивание) с рабочего стола на наблюдаемое место не вызвало события, а скопировало существующий файл и вставило в него новую копию (там, создав новый файл в файловой системе, а не просто перемещая существующий) вызвало событие Changed
.
Моим решением было добавить каждый NotifyFilter
в мой FileSystemWatcher
. Таким образом, я уведомлен во всех случаях, когда FileSystemWatcher
может уведомить меня.
ПРИМЕЧАНИЕ, что он не является полностью интуитивным/очевидным относительно того, какие фильтры будут уведомлять вас о конкретных случаях. Например, я ожидал, что если бы я включил FileName
, что я буду уведомлен о любых изменениях существующего имени файла... вместо этого Attributes
, похоже, обрабатывает этот случай.
watcher.NotifyFilter = NotifyFilters.Attributes |
NotifyFilters.CreationTime |
NotifyFilters.FileName |
NotifyFilters.LastAccess |
NotifyFilters.LastWrite |
NotifyFilters.Size |
NotifyFilters.Security;
Ответ 3
Используйте этот сеттер для включения триггера:
watcher.EnableRaisingEvents = true;
Ответ 4
У нас была очень похожая проблема, когда перемещение папки не вызывало ожидаемых событий. Решение заключалось в том, чтобы скопировать всю папку, а не просто перемещать ее.
DirectoryCopy(".", ".\\temp", True)
Private Shared Sub DirectoryCopy( _
ByVal sourceDirName As String, _
ByVal destDirName As String, _
ByVal copySubDirs As Boolean)
' Get the subdirectories for the specified directory.
Dim dir As DirectoryInfo = New DirectoryInfo(sourceDirName)
If Not dir.Exists Then
Throw New DirectoryNotFoundException( _
"Source directory does not exist or could not be found: " _
+ sourceDirName)
End If
Dim dirs As DirectoryInfo() = dir.GetDirectories()
' If the destination directory doesn't exist, create it.
If Not Directory.Exists(destDirName) Then
Directory.CreateDirectory(destDirName)
End If
' Get the files in the directory and copy them to the new location.
Dim files As FileInfo() = dir.GetFiles()
For Each file In files
Dim temppath As String = Path.Combine(destDirName, file.Name)
file.CopyTo(temppath, False)
Next file
' If copying subdirectories, copy them and their contents to new location.
If copySubDirs Then
For Each subdir In dirs
Dim temppath As String = Path.Combine(destDirName, subdir.Name)
DirectoryCopy(subdir.FullName, temppath, true)
Next subdir
End If
End Sub