我正在尝试使用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文件时,没有任何记录。
答案 0 :(得分:1)
FileSystemWatcher
添加到SengokuMedaru's answer时,默认情况下不包括子文件夹,因此,如果您:
watcher.Path = @"C:\";
...对 C:\ Users \ User1 \ ConfidentialFiles 的更改不会被报告。
您有两种选择。
指定您知道文件将要更改并感兴趣的显式根文件夹。即watcher.Path = @"C:\Users\User1\ConfidentialFiles";
(根据需要可选地设置IncludeSubdirectories
)或...
将IncludeSubdirectories
设置为true
。
请注意,但是建议您将IncludeSubdirectories
的{{1}}设置为true
,因为您将遇到大量流量(并且处于由于缓冲区限制而被截断了)
MSDN:
当您要监视通过Path属性及其子目录指定的目录中包含的文件和目录的更改通知时,请将IncludeSubdirectories设置为true。将IncludeSubdirectories属性设置为false有助于减少发送到内部缓冲区的通知数量。有关筛选出不需要的通知的更多信息,请参见NotifyFilter和InternalBufferSize属性。 More...
答案 1 :(得分:0)
我找到了一个解决方案,那就是明确声明要在其中查找文件更改的目录。否则由于某种原因,它将无法正常工作。
例如:
times(3)