我正在尝试使用Windows服务在某个服务器路径上运行文件观察程序。 我正在使用我的Windows登录凭证来运行该服务,并且能够从我的登录中访问此“someServerPath”。 但是,当我从FileSystemWatcher执行此操作时,它会抛出:
目录名\ someServerPath无效“异常。
var fileWatcher = new FileSystemWatcher(GetServerPath())
{
NotifyFilter=(NotifyFilters.LastWrite|NotifyFilters.FileName),
EnableRaisingEvents=true,
IncludeSubdirectories=true
};
public static string GetServerPath()
{
return string.Format(@"\\{0}", FileServer1);
}
有人可以帮我解决这个问题吗?
答案 0 :(得分:9)
我有使用FileSystemWatcher对象监视UNC路径的项目没有任何问题。
我从您的代码示例中猜测可能是您将观察者指向服务器的根共享(// servername /),这可能不是有效的文件系统共享?我知道它会在Windows资源管理器中返回打印机,计划任务等内容。
尝试将观察者指向根目录下的共享 - 如果您在服务器上拥有远程管理权限,那么// servername / c $ /将是一个很好的测试示例。
答案 1 :(得分:5)
关于更新的问题,我同意您可能需要指定有效的共享,而不仅仅是远程服务器名称。
[更新]修复了之前关于异常的问题:
将名称指定为@"\\someServerPath"
\ \作为单个\
进行转义如果在字符串前加上@符号,则不会处理转义序列。
答案 2 :(得分:3)
我刚刚问过关于作为服务运行的FileSystemWatcher代码的问题,问题是权限。我搜索并找到了这个问题和答案,但不幸的是,这里的答案都没有解决问题。无论如何,我刚刚解决了它,所以我想我会在这里为下一个搜索并找到这个问题的人提出解决方案。
该驱动器已映射为登录用户,但该服务正在 LocalSystem 中运行。 LocalSystem是一个不同的帐户,无权访问用户映射的驱动器。
修复方法是:
您可以使用LocalSystem命令提示符测试LocalSystem身份验证,请参阅How to open a command prompt running as Local System?
答案 3 :(得分:2)
尽管已经回答了这个问题,但我认为即使你提供了有效的路径,我仍然可以看到同样的错误。
当运行观察程序的进程无法访问远程共享时,您将收到相同的错误。如果观察者在系统帐户下运行的服务中并且共享由用户创建,则会发生这种情况。系统无法访问该共享并且无法识别它,您需要模拟用户才能访问它。
答案 4 :(得分:1)
虽然您可以通过网络使用FileWatcher,但您必须考虑其他因素,例如断开网络共享。如果终止与共享的连接(维护,延迟,设备重置等),您将不再拥有文件管理器中共享的有效句柄
答案 5 :(得分:0)
您是否有任何特殊原因未在具有您要观看的目录的物理计算机上运行FileSystemWatcher?
答案 6 :(得分:-2)
您不能通过网络共享使用目录监视,这是操作系统的限制,而不是.NET。