我正在尝试开发一个概念验证WCF Web服务,该服务使用FileSystemWatcher类来监听目录,并简单地输出更改类型和更改的文件的完整路径。
我有一个示例控制台应用程序按预期工作但当我将其移植到WCF库时,文件更改的事件处理程序永远不会触发。
代码:
public void MonitorFolder()
{
System.IO.FileSystemWatcher watcher = new System.IO.FileSystemWatcher();
watcher.Path = System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "folder-to-watch");
watcher.IncludeSubdirectories = false;
watcher.Changed += watcher_Changed;
watcher.Filter = "*.*";
watcher.NotifyFilter = NotifyFilters.LastAccess |
NotifyFilters.LastWrite |
NotifyFilters.FileName |
NotifyFilters.DirectoryName;
watcher.EnableRaisingEvents = true;
}
void watcher_Changed(object sender, System.IO.FileSystemEventArgs e)
{
Console.WriteLine(string.Format("Change: {0}, File: {1}", e.ChangeType, e.FullPath));
}
在调用服务的客户端类中:
static void Main(string[] args)
{
FileListenerClient c = new FileListenerClient();
c.MonitorFolder();
c.Close();
}
为什么这不能获取文件更改的任何想法?
答案 0 :(得分:2)
Environment.SpecialFolder.Desktop
表示当前用户的桌面。
如果您的服务位于LocalSystem
帐户(或类似帐户)下,则它会监控自己的桌面,而不是当前交互式用户的桌面,您要更改文件或文件夹。
当然,服务帐户的桌面保持不变,因此,事件不会触发。
答案 1 :(得分:1)
与普通的Windows服务相比,您可能误解了WCF服务的目的。默认情况下,WCF服务仅在呼叫时激活。它不像正常的Windows服务一样在后台运行。
对于您的确切示例,您可能需要在关闭之前进行一种等待,并且您需要您的观察者只是您的函数中的局部变量,而是一个类变量才能使其工作。
答案 2 :(得分:0)
假设a)您详细说明的行为是您想要的,b)您正在观看正确的文件夹,您是否看过InternalBufferSize和FileSystemWatcher中众所周知的问题?