【发布时间】:2010-05-06 09:05:36
【问题描述】:
我正在写一个服务来观察不同文件夹中是否存在不同的文件...... 我正在使用文件系统观察器来获取事件。
作为部署的一部分,有时会删除并新建一个监视文件夹。
因此服务抛出错误并被停止...
是否有可能通过服务捕获这种错误并在新文件夹上重新创建文件观察器?
【问题讨论】:
我正在写一个服务来观察不同文件夹中是否存在不同的文件...... 我正在使用文件系统观察器来获取事件。
作为部署的一部分,有时会删除并新建一个监视文件夹。
因此服务抛出错误并被停止...
是否有可能通过服务捕获这种错误并在新文件夹上重新创建文件观察器?
【问题讨论】:
捕捉已删除的事件,然后通过定时投票重新安排时间以观看新事件?
我现在手头没有编译器,但我敲出了这个伪代码:
using System;
using System.IO;
public class Watcher : IDisposable{
void Dispose(){ watcher.OnDeleted -= onDelete; }
string file;
FileSystemWatcher watcher;
FileSystemEventHandler onDelete;
public class Watch(string file, FileSystemEventHandler onDelete) {
this.file = file;
watcher = new FileSystemWatcher{ Path = file }
this.OnDelete = onDelete;
watcher.Deleted += onDelete;
watcher.NotifyFilter = ...; // looking for delete event;
// Begin watching.
watcher.EnableRaisingEvents = true;
}
}
public static class watch {
Watcher watcher;
public static void Main() {
watcher = new Watcher("somedir", ondeleted);
SetUpChangeWatchers();
while(true){
// stuff!
}
CleanUpChangeWatchers();
}
private static void ondeleted(object source, RenamedEventArgs e){
CleanUpChangeWatchers();
watcher.Dispose();
while(!directoryRecreated(file)){
Thread.Sleep(...some delay..);
}
SetUpChangeWatchers();
watcher = new Watcher("somedir", ondeleted);
}
}
【讨论】:
您可以使用 .deleted 事件来处理这个问题。但是,如果删除分配给 filesystemwatcher.Path 的目录,可能会导致错误。解决此问题的一种方法是将监视目录的父级分配给 filesystemwatcher.Path。然后它应该在 .deleted 事件中捕获删除。
如果您尝试访问刚刚删除的目录,处理程序内部也可能出现错误。发生这种情况时,你可能无法获得正常的断点,并且似乎是由删除本身引起的。
【讨论】: