6

我正在尝试使用 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);              
}

谁能帮我解决这个问题?

4

7 回答 7

9

我有使用 FileSystemWatcher 对象监视 UNC 路径的项目,没有任何问题。

通过查看您的代码示例,我的猜测可能是您将观察者指向服务器的根共享(//servername/),这可能不是有效的文件系统共享?我知道它会在 Windows 资源管理器中返回打印机、计划任务等。

尝试将观察者指向根目录下的共享 - 如果您在服务器上具有远程管理权限,则 //servername/c$/ 之类的内容将是一个很好的测试示例。

于 2009-06-06T22:08:58.677 回答
5

关于更新的问题,我同意您可能需要指定一个有效的共享,而不仅仅是远程服务器名称。

[更新] 修复了之前关于异常的问题:

指定名称为@"\\someServerPath"

\ 被转义为单个 \

当您在字符串前面加上 @ 符号时,它不会处理转义序列。

于 2009-06-06T19:14:41.390 回答
3

我刚刚被问到这个关于作为服务运行的 FileSystemWatcher 代码的问题,问题是权限。我搜索并找到了这个问题和答案,但不幸的是,这里的答案都没有解决问题。无论如何,我刚刚解决了它,所以我想我会在这里为下一个搜索并找到这个问题的人提供解决方案。

该驱动器被映射为登录用户,但该服务作为LocalSystem运行。LocalSystem 是一个不同的帐户,无权访问用户映射的驱动器。

解决方法是:

  1. 首先进行身份验证(我使用C# 类通过凭据建立网络连接
  2. 以有权访问共享的用户身份运行您的服务。

您可以使用 LocalSystem 命令提示符测试 LocalSystem 身份验证,请参阅如何打开作为本地系统运行的命令提示符?

于 2012-11-30T17:21:38.190 回答
2

即使已经回答了这个问题,我想我会投入两美分,因为即使你提供了有效的路径,你也会看到同样的错误。

当运行观察程序的进程无权访问远程共享时,您将收到相同的错误。如果观察者在系统帐户下运行的服务中并且共享是由用户创建的,则会发生这种情况。系统无权访问该共享并且无法识别它,您需要模拟用户才能访问它。

于 2010-07-23T04:40:33.837 回答
1

尽管您可以通过网络使用 FileWatcher,但您必须考虑其他因素,例如网络共享的断开连接。如果您与共享的连接被终止(维护、延迟、设备重置等),您将不再在文件观察器中拥有对共享的有效句柄

于 2010-08-24T22:02:01.160 回答
0

您没有在具有您要监视的目录的物理机器上运行 FileSystemWatcher 是否有任何特殊原因?

于 2009-06-06T19:22:52.063 回答
-2

您不能在网络共享上使用目录监视,这是操作系统的限制,而不是 .NET。

于 2009-06-06T20:42:00.210 回答