C#FileSystemWatcher在服务中使用时未触发
我正在尝试使用FileSystemWatcher创建一个服务来检测我的C驱动器中的一些更改 下面的代码没有触发,我不知道为什么C#FileSystemWatcher在服务中使用时未触发,c#,service,filesystemwatcher,C#,Service,Filesystemwatcher,我正在尝试使用FileSystemWatcher创建一个服务来检测我的C驱动器中的一些更改 下面的代码没有触发,我不知道为什么 FileSystemWatcher watcher; protected override void OnStart(string[] args) { trackFileSystemChanges(); watcher.EnableRaisingEvents = true; } trackFileSystemC
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文件的更改将不报告
你有两个选择
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:\";