C#FileSystemWatcher在服务

时间:2017-11-01 16:43:24

标签: c# service filesystemwatcher

我正在开发一项服务,在我的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来执行此操作,或者我应该使用其他内容,因为此代码在服务中?

2 个答案:

答案 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检测到其他文件系统事件