我正着手创建一个应用程序,该应用程序将查看创建的任何文件的目录。非常简单的时间来使用filesystemwatcher。我的问题涉及如何利用它。通常的做法是使用Windows服务来确保应用程序始终在运行吗?
我一直试图摆脱构建Windows服务,如果我没有,但我真的没有看到在这种情况下这样做的替代方案。通常,我会将我的服务转换为控制台应用程序并使用Windows调度程序安排它,但这并不适用于这种情况。
任何人都可以推荐一种更好的方法来实现filesystemwatcher而不是Windows服务吗?
感谢您的任何想法。
修改 的 响应下面的评论,更具体地说,我只需要观察服务器上的目录,并且当创建新文件时,我必须将该文件的副本移动到同一服务器上的不同目录中,也许重命名它在这个过程中。
文件的频率和数量都很小。一天最多5-10个。
答案 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是正确的工作工具(文件系统监视的本机代码是一个正确的方法),并且服务是部署它的正确机制,因为您需要“始终开启”操作。
服务凭证也将独立于登录用户,这可能对您有用。