【问题标题】:filesystemwatcher as windows service?文件系统观察器作为 Windows 服务?
【发布时间】:2010-10-20 18:23:09
【问题描述】:

我正在着手创建一个应用程序,该应用程序将监视创建的任何文件的目录。使用文件系统观察器的时间非常简单。我的问题与如何使用它有关。使用 Windows 服务来确保应用程序始终运行是常见的做法吗?

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

谁能推荐一种比 Windows 服务更好的实现文件系统观察器的方法?

感谢您的任何想法。

编辑 为了响应下面的 cmets,更具体地说,我只需要查看服务器上的目录,当创建新文件时,我必须将该文件的副本移动到同一服务器上的不同目录中,也许重命名它在这个过程中。

文件的频率和数量会很小。一天最多可能 5-10 次。

【问题讨论】:

  • 也许可以在内存占用较少的语言/运行时实现服务,并且仅在找到新文件时运行您的 C# 程序。
  • @CodeInChaos - 不是一个好主意。实现本机 FSW 功能要困难得多,双进程解决方案也很复杂。我以为我们已经摆脱了关于托管代码的刻板印象?
  • 真的吗,CodeInChaos?我完全是为了提高效率,但我不确定您的评论是否特别有建设性,而且我当然不想成为稍后在为项目的不同部分切换语言时挖掘某人代码的人。 (话虽这么说,我想我们都经常这样做......)
  • 您的问题不清楚。您建议使用 FSW 来确保应用程序正在运行?

标签: c# windows-services filesystemwatcher


【解决方案1】:

我还不确定文件观察器是如何工作的,但这是我的想法:文件系统触发事件;我的意思是 NTFS 必须这样做。您的文件观察器挂钩到这些事件。文件观察器可能会挂起它正在运行的线程,直到发生事件并且该事件以某种方式唤醒线程。挂起的线程在挂起时使用几乎很少的 cpu 周期(实际上没有),因此等待文件事件没有任何成本。因此,轮询方法会浪费很多 cpu 周期(这是法语,意思是“垃圾负载”),但文件观察程序不会。您可能可以查看 PerfMon,看看这是否可能是真的。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 非常正确,尽管 WCF 是比 Remoting 更好的选择,Remoting 目前已被弃用。
    • 哦,太好了……真的!?哇,我最近花了很多时间搞清楚 Remoting 及其所有的废话。 :-D 哦,好吧...我想我现在应该去学习 WCF。
    • WCF 非常棒,而且很容易上手。您也可以通过配置轻松更改功能
    【解决方案3】:

    是的,使用服务进行这种操作,但是don'tusefilesystemwatcher。如果您轮询服务中的文件,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
    

    【讨论】:

    • 您推荐的替代文件系统观察器的方法。
    • 唯一的非轮询替代方案是 ReadDirectoryChangesW - 要做到这一点要困难得多,而且同样存在可靠性问题。
    • 到目前为止,我对这个 FileSystemWatcher 包装器很幸运……隐藏了几个缺点。 codeproject.com/KB/cs/EnhancedFileSysWatcher.aspx
    【解决方案4】:

    使用 Windows 服务包装 FileSystemWatcher 非常适合您的需要。

    FSW 是适合这项工作的工具(用于文件系统监视的本机代码很难做到),并且服务是部署它的正确机制,因为您需要“始终在线”操作。

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

    【讨论】:

    • 对 FSW 不能再不同意了。它在几种情况下被证明是不可靠的。将其删除并替换为轮询机制(非 Win32 管理)解决了所有问题。
    猜你喜欢
    • 2012-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-13
    • 2011-12-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多