我正在开发一项服务,在我的OnStart
方法中,我有以下几行代码来设置我的FileSystemWatcher
Log.Info($"File location {_location}");
var watcher = new FileSystemWatcher(_location);
watcher.Changed += new FileSystemEventHandler(OnChanged);
然后在我的OnChanged
方法中,我想要启动一个这样的计时器:
private void OnChanged(object source, FileSystemEventArgs e)
{
Log.Info($"A file has been placed in {_location} starting timer");
OnTimer(null, null); //run immediately at startup
StartEventTimer();
}
定时器代码有效,所以我知道这不是问题,同样在我的日志中我知道它正在检查正确的位置。我错过了什么?
我想让我的代码做的就是触发我的计时器,当文件放在我的目标位置时,我却无法这样做。我是否正确,我应该使用FileSystemWatcher
来执行此操作,或者我应该使用其他内容,因为此代码在服务中?
答案 0 :(得分:1)
您可能会发现Changed事件在新文件上多次触发,这是某些应用程序的常见问题,这可能会在以后产生不必要的副作用。看看并尝试改为创建。
如果您要查找文件夹中出现的新文件,则应使用:
watcher.NotifyFilter = NotifyFilters.FileName;
watcher.Created += OnCreated;
Gist demonstrating it firing twice using Changed on LastWrite以及可预测的行为,Gist demonstrating single fire on file create using Created and NotifyFilter.FileName
只需在Console App中运行它并将文件复制到c:\ temp。
答案 1 :(得分:0)
根据你在那里说的话,可能有几件事情。
首先要注意的是var watcher
的声明看起来不是类变量,并且在退出OnStart()
时会超出范围。您需要在此之外移动声明。
第二个感兴趣的项目是EnableRaisingEvents
似乎未被设置。 FileSystemWatcher
的一个工作示例如下。
public class SomeService
{
private FileSystemWatcher _watcher;
public void OnStart()
{
// set up the watcher
_watcher = new FileSystemWatcher(_location);
_watcher.Path = path;
_watcher.NotifyFilter = NotifyFilters.LastWrite;
_watcher.Filter = "*.*";
_watcher.Changed += new FileSystemEventHandler(OnChanged);
_watcher.EnableRaisingEvents = true;
}
}
修改强>
正如Ben Hall所提到的,当文件移入文件夹时,可能会为同一个文件引发多个事件。根据{{3}};
通用文件系统操作可能会引发多个事件。例如,当文件从一个目录移动到另一个目录时,可能会引发几个OnChanged和一些OnCreated和OnDeleted事件。移动文件是一项复杂的操作,由多个简单操作组成,因此可以引发多个事件。同样,某些应用程序(例如,防病毒软件)可能会导致FileSystemWatcher检测到其他文件系统事件