Вопрос по filesystemwatcher, c# – FileSystemWatcher не запускает события

22

По какой-то причине мой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));
    }
}
Я вручную создал, переименовал и удалил файлы в моем каталоге. Ничто не стреляет. gwin003
Локальный диск, его папка AppData / Roaming, чтобы быть более конкретным gwin003
Что вы сделали, чтобы убедиться, что возникает ситуация, в которой эти события должны срабатывать? tnw
Проверьтепример кода здесь, Попробуй это tnw

Ваш Ответ

4   ответа
22

что я ожидал, что определенные действия приведут кFileSystemWatcher Changed событие для огня. Например, перемещение файла (щелчок и перетаскивание) с рабочего стола в отслеживаемое местоположение не вызвало событие, но скопировало существующий файл и вставило его новую копию (там путем создания нового файла в файловой системе, а не просто перемещения существующий) вызвалChanged событие, которое будет поднято.

Мое решение было добавить каждыйNotifyFilter к моемуFileSystemWatcher, Таким образом, меня уведомляют во всех случаях, когдаFileSystemWatcher может уведомить меня.

НОТА что это не такСовершенно интуитивно понятно, какие фильтры будут уведомлять вас о конкретных случаях. Например, я ожидал, что если я включуFileName что я буду уведомлен о любых изменениях в существующем файле »имя ... вместоAttributes кажется, справиться с этим делом.

watcher.NotifyFilter = NotifyFilters.Attributes |
    NotifyFilters.CreationTime |
    NotifyFilters.FileName |
    NotifyFilters.LastAccess |
    NotifyFilters.LastWrite |
    NotifyFilters.Size |
    NotifyFilters.Security;
-1

когда перемещение папки не вызывало ожидаемых событий. Решением было распечатать всю папку целиком, а не просто переместить ее.

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
вопрос в c # не vb Luca Ziegler
6

watcher.EnableRaisingEvents = true;
О боже, большое спасибо за это. Меня поражает, что этот флаг требуется для событий. David Haxton
Ого ... Это заняло час моей жизни: / Странный выбор, чтобы установить егоfalse по умолчанию. Арен»т события как основная вещь, почему выхочу использоватьFileSystemWatcher на первом месте? the berserker
21

вы создаете FileSystemWatcher как локальную переменную в методе установки. Это, конечно, выйдет из области видимости в конце метода и вполне может быть приведено в порядок в этот момент, что приведет к удалению часов.

Попробуйте создать FSW в той точке, где она будет сохраняться (например, переменная уровня программы), и посмотрите, не поможет ли это вам.

@ gwin003 Этобыло локальная переменная. Я подозреваю, что вы имеете в виду, что вы переехали в частныйполе? Fredrik Mörk
@adospace:stackoverflow.com/questions/298261/... Chris
Вы можете редактировать комментарии только в течение ограниченного периода времени (думаю, 5 минут). Рад, что это помогло. Еще один момент, который следует отметить в отношении ЖСБ, заключается в том, что они могутзапускать события на сетевых дисках. Не относится к вам сейчас из приведенных выше комментариев, но большая ошибка, если вы когда-нибудь захотите. :) Chris
Я переместилFileSystemWatcher в приватную локальную переменную, и теперь она работает более согласованно. gwin003

Похожие вопросы