FileSystemWatcher用于监视UNC路径

关于这个话题不乏问题,但我仍然遇到麻烦。 这是我的情况。 我有一个服务,我需要观看配置文件中指定的路径。 当我使用本地驱动器时,它工作得很好。

但是,当我将其更改为类似\\server2\secondary\temp\watch_folder的内容时,服务无法启动。 日志中的错误是

目录名称\\ server2 \ secondary \ temp \ watch_folder无效。

如果我将其直接复制到Windows资源管理器中,该文件夹打开正常 如果我将我的代码粘贴到旧的Winforms应用程序中,它可以正常工作。 我已经尝试了所有“登录身份”帐户。 我将其设置为使用管理员帐户,但仍然没有骰子。

这是我的代码:

 _watcher = new FileSystemWatcher(); _watcher.Path = ConfigurationManager.AppSettings["WatchFolder"]; _watcher.NotifyFilter = NotifyFilters.LastWrite | NotifyFilters.FileName; _watcher.Filter = "*.txt"; _watcher.Created += new FileSystemEventHandler(OnCreated); _watcher.Error += new ErrorEventHandler(OnError); _watcher.EnableRaisingEvents = true; 

有任何想法吗? 我很茫然,此时我觉得我已经盯着它看了太久。 我真诚地感谢任何帮助。

谢谢,尼克

编辑这是例外:

服务无法启动。 System.ArgumentException:目录名\ server2 \ Secondary \ temp \ watch_folder无效。
在System.IO.FileSystemWatcher.set_Path(String value)
在FileWatcher.FileWatcher.Watch()
在FileWatcher.FileWatcher.OnStart(String [] args)
在System.ServiceProcess.ServiceBase.ServiceQueuedMainCallback(对象状态)

我刚试过这个:

 var _watcher = new FileSystemWatcher(); _watcher.Path = @"\\10.31.2.221\shared\"; _watcher.NotifyFilter = NotifyFilters.LastWrite | NotifyFilters.FileName; _watcher.Filter = "*.txt"; _watcher.Created += new FileSystemEventHandler((x, y) =>Console.WriteLine("Created")); _watcher.Error += new ErrorEventHandler( (x, y) =>Console.WriteLine("Error")); _watcher.EnableRaisingEvents = true; Console.ReadKey(); 

这没有问题,但是我在以下情况下复制了您的例外:

  • 正在运行的用户无权读取远程文件夹。
  • 远程文件夹不存在。

您的问题肯定与权限有关,我认为正在运行的用户没有所需的权限。

您可以尝试的另一件事是将远程文件夹映射到一个本地。

在cmd中执行:

 NET USE Z: \\server2\Secondary\temp\watch_folder /user:Domain\UserName Password 

然后在你的代码中:

 _watcher.Path = @"Z:\"; 

您的服务可能在没有该共享权限的用户帐户下运行。 尝试更改Windows服务以在不同凭据下运行。

我找到了一种非常酷的方法,可以在代码项目的Windows服务中使用FileSystemWatcher获取凭据。

见Adrian Hayes的post: http : //www.codeproject.com/Articles/43091/Connect-to-a-UNC-Path-with-Credentials

他的解决方案很有效。

您可能需要将路径设为

 \\server2\\Secondary\\temp\\watch_folder 

我也碰到了这个问题。 我的修复是将我们公司的域名包含在服务器路径中:

 \\servername.company.com\directorytowatch