filesystemwatcher作为Windows服务?

时间:2010-10-20 18:23:09

标签: c# windows-services filesystemwatcher

我正着手创建一个应用程序,该应用程序将查看创建的任何文件的目录。非常简单的时间来使用filesystemwatcher。我的问题涉及如何利用它。通常的做法是使用Windows服务来确保应用程序始终在运行吗?

我一直试图摆脱构建Windows服务,如果我没有,但我真的没有看到在这种情况下这样做的替代方案。通常,我会将我的服务转换为控制台应用程序并使用Windows调度程序安排它,但这并不适用于这种情况。

任何人都可以推荐一种更好的方法来实现filesystemwatcher而不是Windows服务吗?

感谢您的任何想法。

修改 的 响应下面的评论,更具体地说,我只需要观察服务器上的目录,并且当创建新文件时,我必须将该文件的副本移动到同一服务器上的不同目录中,也许重命名它在这个过程中。

文件的频率和数量都很小。一天最多5-10个。

4 个答案:

答案 0 :(得分:3)

我不确定文件监视器的工作原理,但这就是我的想法:文件系统触发事件;我的意思是像NTFS必须这样做。您的文件观察者会挂钩这些事件。文件观察程序可能会暂停正在运行的线程,直到事件发生并且事件以某种方式唤醒线程。挂起的线程在暂停时使用非常少的cpu周期(实际上没有),因此等待文件事件不需要任何费用。所以一个轮询的方法浪费了很多cpu循环(这是法语,它意味着'一个狗屎负载')cpu循环,但文件观察者没有。您可以查看PerfMon,看看这是否可能。

答案 1 :(得分:2)

您应该详细描述您想要做什么,但通常如果您需要在后台运行并且不需要直接用户交互,那么服务通常是有意义的。

如果您愿意,可以根据需要使用远程处理将前端连接到您的服务。

答案 2 :(得分:1)

是的,请使用服务进行此类操作,但don't use filesystem watcher。如果您在服务中轮询文件,dont use也可以使用Timer类。

检查以确保文件已完成写入并且在尝试移动之前不再锁定。

调查文件更改(语法可能已关闭)非常简单,并且消除了与文件系统观察程序事件相关的大量额外编程。

While True 'or your exit condition'
 Dim _files() as FileInfo = Directory.GetFiles(yourTargetDirectory)
 For Each _file as FileInfo In _files
  If _file.LastModifiedDate < DateTime.Now.AddMinutes(1) Then
    'move your files'
  End If
 Next

End While

答案 3 :(得分:0)

使用Windows服务来包装FileSystemWatcher完全可以满足您的需求。

FSW是正确的工作工具(文件系统监视的本机代码是一个正确的方法),并且服务是部署它的正确机制,因为您需要“始终开启”操作。

服务凭证也将独立于登录用户,这可能对您有用。