在服务中使用C#FileSystemWatcher时不会触发

时间:2018-06-22 03:42:06

标签: c# service filesystemwatcher

我正在尝试使用FileSystemWatcher进行服务以检测我的C驱动器中的某些更改。

以下代码未触发,我不确定为什么。

FileSystemWatcher watcher;

    protected override void OnStart(string[] args)
    {
        trackFileSystemChanges();
        watcher.EnableRaisingEvents = true;
    }

trackFileSystemChanges()方法基本上将观察者设置为监视LastWrite和LastAccess时间的更改,目录中文本文件的创建,删除或重命名。

    [PermissionSet(SecurityAction.Demand, Name = "FullTrust")]
    public void trackFileSystemChanges()
    {
        watcher = new FileSystemWatcher();

        watcher.Path = @"C:\";
        Library.WriteErrorLog(watcher.Path);
        watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite | NotifyFilters.FileName | NotifyFilters.DirectoryName;
        watcher.Filter = "*.*";

        watcher.Changed += new FileSystemEventHandler(OnChanged);
        watcher.Created += new FileSystemEventHandler(OnChanged);
        watcher.Deleted += new FileSystemEventHandler(OnChanged);
        watcher.Renamed += new RenamedEventHandler(OnRenamed);
    }

当txt文件被更改或重命名时,日志将被写入文件。

    private static void OnChanged(object source, FileSystemEventArgs e)
    {
        // Specify what is done when a file is changed, created, or deleted.
        Library.WriteErrorLog("File: " + e.FullPath + " " + e.ChangeType);
    }

    private static void OnRenamed(object source, RenamedEventArgs e)
    {
        // Specify what is done when a file is renamed.
        Library.WriteErrorLog("File: " + e.OldFullPath + "renamed to " + e.FullPath);
    }

Library.WriteErrorLog方法没有问题,因为我已经用其他东西对其进行了测试。当服务启动时,当我尝试在C驱动器中编辑/重命名一些txt文件时,没有任何记录。

2 个答案:

答案 0 :(得分:1)

FileSystemWatcher添加到SengokuMedaru's answer时,默认情况下包括子文件夹,因此,如果您:

watcher.Path = @"C:\";

...对 C:\ Users \ User1 \ ConfidentialFiles 的更改不会被报告

您有两种选择。

  1. 指定您知道文件将要更改并感兴趣的显式根文件夹。即watcher.Path = @"C:\Users\User1\ConfidentialFiles";(根据需要可选地设置IncludeSubdirectories)或...

  2. IncludeSubdirectories设置为true


请注意,但是建议您将IncludeSubdirectories的{​​{1}}设置为true,因为您将遇到大量流量(并且处于由于缓冲区限制而被截断了)


MSDN:

  

当您要监视通过Path属性及其子目录指定的目录中包含的文件和目录的更改通知时,请将IncludeSubdirectories设置为true。将IncludeSubdirectories属性设置为false有助于减少发送到内部缓冲区的通知数量。有关筛选出不需要的通知的更多信息,请参见NotifyFilter和InternalBufferSize属性。 More...

答案 1 :(得分:0)

我找到了一个解决方案,那就是明确声明要在其中查找文件更改的目录。否则由于某种原因,它将无法正常工作。

例如:

times(3)