代码之家  ›  专栏  ›  技术社区  ›  czuroski

作为Windows服务的FileSystemWatcher?

  •  8
  • czuroski  · 技术社区  · 14 年前

    我正准备创建一个应用程序,它将监视目录中任何创建的文件。使用文件系统监视程序非常简单。我的问题是如何利用它。使用Windows服务来确保应用程序始终运行是一种常见的做法吗?

    如果不需要的话,我一直在努力避免构建Windows服务,但在本例中,我真的没有找到其他方法来替代这种方法。通常,我会将我的服务转换为控制台应用程序,并使用Windows调度程序对其进行调度,但在这种情况下,这并不真正适用。

    有人能推荐比Windows服务更好的方法来实现FileSystemWatcher吗?

    谢谢你的想法。

    编辑 为了响应下面的注释,更具体地说,我只需要观察服务器上的目录,当创建新文件时,我必须将该文件的副本移动到同一服务器上的其他目录中,可能在过程中对其进行重命名。

    文件的频率和数量将非常小。一天最多5-10次。

    4 回复  |  直到 13 年前
        1
  •  2
  •   Brad    14 年前

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

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

        2
  •  3
  •   Jelly    13 年前

    我还不确定文件监视程序是如何工作的,但这正是我所想的:文件系统触发事件;我的意思是像NTFS那样必须这样做。您的文件监视程序会钩住这些事件。文件监视程序可能会挂起它正在运行的线程,直到某个事件发生并且该事件以某种方式唤醒该线程为止。挂起的线程在挂起的时候使用很少的CPU周期(实际上没有),因此等待文件事件不需要花费任何费用。因此,一个民意调查方法浪费了大量的CPU周期(这是法语,意思是“垃圾负载”),但文件观察者没有。你可以看看Perfmon,看看这是否可能是真的。

        3
  •  1
  •   Community CDub    7 年前

    是的,使用服务进行这种操作,但是 don't use filesystem watcher . 如果您对服务中的文件进行投票, dont use 计时器类也可以。

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

    对文件更改进行轮询(语法可能已关闭)是很简单的,并且消除了与文件系统监视程序事件相关联的许多额外编程。

    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
    
        4
  •  0
  •   Steve Townsend    14 年前

    使用Windows服务包装 FileSystemWatcher 完全可以满足你的需要。

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

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