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

C#FileSystemWatcher在服务中使用时未触发,c#,service,filesystemwatcher,C#,Service,Filesystemwatcher,我正在尝试使用FileSystemWatcher创建一个服务来检测我的C驱动器中的一些更改 下面的代码没有触发,我不知道为什么 FileSystemWatcher watcher; protected override void OnStart(string[] args) { trackFileSystemChanges(); watcher.EnableRaisingEvents = true; } trackFileSystemC

我正在尝试使用FileSystemWatcher创建一个服务来检测我的C驱动器中的一些更改

下面的代码没有触发,我不知道为什么

FileSystemWatcher watcher;

    protected override void OnStart(string[] args)
    {
        trackFileSystemChanges();
        watcher.EnableRaisingEvents = true;
    }
trackFileSystemChanges()方法基本上将watcher设置为监视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文件时,没有任何记录

我找到了一个解决方案,那就是明确说明我试图查找文件更改的目录。否则,由于某种原因,它将不起作用

例如:

添加到,默认情况下,
FileSystemWatcher
不包含子文件夹,因此如果您:

watcher.Path = @"C:\";
…对C:\Users\User1\secretential文件的更改将不报告

你有两个选择

  • 指定您知道文件将在其中更改并感兴趣的显式根文件夹。i、 e.
    watcher.Path=@“C:\Users\User1\secretentialfiles”(根据需要可选择设置
    包含子目录
    )或

  • IncludeSubdirectories
    设置为
    true


  • 注意但是设置
    包括子目录
    true
    以及
    watcher.Path=@“c:\”
    不可取,因为您将遇到大量的通信量(并且由于缓冲区限制,可能会被截断)


    MSDN:

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


    您是否先在控制台应用程序中尝试过此操作?服务是否以具有文件系统权限的用户身份运行,如SYSTEM?请务必查看@Josh,如果“SYSTEM”是指
    本地系统
    ,那么a)它不是“用户”,b)“顺便问一句
    [PermissionSet(SecurityAction.Demand,Name=“FullTrust”)]
    在提升或确保代码在该CAS级别上运行方面实际上没有任何作用,需要先查找它,并在创建
    AppDomain
    时授予它。FSW很可能正在执行显式CAS请求,如果调用链未得到满足,该请求将出现故障。但您已将其设置为
    C:
    。如何解释它适用于一个子文件夹而不是整个C驱动器?
    watcher.Path = @"C:\";