FileSystemWatcher没有触发事件

本文关键字:事件 FileSystemWatcher | 更新日期: 2023-09-27 18:11:32

由于某种原因,我的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没有触发事件

您似乎在setup方法中将FileSystemWatcher创建为本地变量。当然,这将在方法结束时超出范围,并且可能在此时被整理,从而删除手表。

尝试在它将被持久化的地方创建FSW(例如程序级变量),看看这是否能将您分类。

我的问题是我期望某些动作导致FileSystemWatcher Changed事件着火。例如,将文件从桌面移动(点击并拖动)到监视位置不会引发事件,但复制现有文件并粘贴其新副本(通过向文件系统创建新文件而不是简单地移动现有文件)会引发Changed事件。

我的解决方案是将每个NotifyFilter添加到我的FileSystemWatcher。这样,在FileSystemWatcher能够通知我的所有情况下,我都会得到通知。

注意对于哪些过滤器将在特定情况下通知您并不是完全直观/明显的。例如,我期望,如果我包含FileName,我将被通知任何现有文件名的更改…相反,Attributes似乎可以处理这种情况。

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

使用此setter来启用触发器:

watcher.EnableRaisingEvents = true;

我的问题是,我希望它也监视子目录,但默认情况下它不会这样做。如果你想同时监控子目录,那么将inclesubdirectories属性设置为true(默认为false):

fileSystemWatcher.IncludeSubdirectories = true;

我遇到了同样的问题,移动或复制粘贴文件不会触发文件监视程序。但是,如果我重命名或更改目录中的文件,它就可以工作。我查看了文档(https://learn.microsoft.com/en-us/dotnet/api/system.io.filesystemwatcher?view=net-7.0),并没有跳出可能导致此问题的原因。最后,还有一个提示,可能是文件夹安全性,因为我读到过文件夹安全性是如何不同的。然后我进入文件夹安全性和高级设置。我给我的用户帐户提供了审计权限。我还将我的用户帐户添加到Effective Access。然后,一切都成功了。我可以移动和剪切/粘贴文件。Filewatcher现在回应了。

我们刚刚遇到了一个非常类似的问题,移动文件夹没有触发预期的事件。解决方案是硬拷贝整个文件夹,而不是仅仅移动它。

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