创建互斥锁时出现“找不到路径的一部分”错误
Posted
技术标签:
【中文标题】创建互斥锁时出现“找不到路径的一部分”错误【英文标题】:"Could not find a part of the path" error while creating Mutex 【发布时间】:2013-12-21 00:37:20 【问题描述】:我对此感到困惑,有人可以告诉我为什么,当我打电话时:
using (Mutex mtx = new Mutex(false, strId))
我得到了这个例外:
找不到路径的一部分。
如果strId
设置为localhost\SQLEXPRESS-MyName-2
之类的东西?
【问题讨论】:
@paqogomez:好吧,我不知道为什么在打开互斥锁时会引发DirectoryNotFoundException
?那里没有连接...
如果你读到他的错误:找不到路径'Because you are using a backslash in your name (\) it assumes you are trying to specify a visibility level, and then discovers localhost isn't a valid visibility level - hence generating the exception.
祝你好运:)
我提名这个重新打开,因为另一个主题的答案是......至少可以说“不完整”,而且说得更多是非常不正确的。
【参考方案1】:
From the docs:
在运行终端服务的服务器上,命名系统互斥体 可以有两个级别的可见性。如果它的名字以前缀开头 “Global\”,互斥锁在所有终端服务器会话中可见。如果 它的名称以前缀“Local\”开头,互斥锁仅在 创建它的终端服务器会话。在这种情况下,一个 同名的单独互斥体可以存在于每个其他互斥体中 服务器上的终端服务器会话。如果不指定前缀 创建命名互斥体时,它采用前缀“Local\”。在一个 终端服务器会话,两个互斥体,其名称仅在它们的 前缀是单独的互斥体,两者都对所有进程可见 在终端服务器会话中。即前缀名称“Global\” 和 "Local\" 描述了与终端相关的互斥锁名称的范围 服务器会话,与进程无关。
因为您在名称中使用了反斜杠 (\
),所以它假定您正在尝试指定可见性级别,然后发现 localhost
不是有效的可见性级别 - 因此会生成异常。
.NET 文档没有明确提到 \
是 Mutex 名称中的保留字符,这很奇怪,Win32 文档确实更好地解释了它 (link):
名称可以有一个“Global\”或“Local\”前缀来显式创建 全局或会话命名空间中的对象。 剩下的 name 可以包含除反斜杠字符 () 之外的任何字符。为了 更多信息,请参阅Kernel Object Namespaces。快速用户切换是 使用终端服务会话实现。内核对象名称必须 遵循为终端服务概述的指南,以便 应用程序可以支持多个用户。
【讨论】:
谢谢。这也是我提到的:msdn.microsoft.com/en-us/library/windows/desktop/…,但没有明确提到斜线。他们只谈论Global`,
Local` 和 `Session` 前缀,所以我认为只要我不使用这些前缀,我就可以了。好吧,显然不是……以上是关于创建互斥锁时出现“找不到路径的一部分”错误的主要内容,如果未能解决你的问题,请参考以下文章
使用 Typescript 创建 Firebase 云函数时出现“找不到名称‘ServiceWorkerRegistration’”错误