Подтвердить что ты не робот

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));
    }
}
4b9b3361

Ответ 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