创建互斥锁时出现“找不到路径的一部分”错误

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?那里没有连接... 如果你读到他的错误:找不到路径''的一部分。问题的答案也是您的解决方案。 好的,我明白你的意思了。虽然再次引发目录异常很奇怪......但是,哦,好吧,我想我必须替换斜杠...... 至于它为什么被提出,我认为@Niels 回答这个问题做得很好。 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` 前缀,所以我认为只要我不使用这些前缀,我就可以了。好吧,显然不是……

以上是关于创建互斥锁时出现“找不到路径的一部分”错误的主要内容,如果未能解决你的问题,请参考以下文章

在现有文件上设置属性时出现错误“找不到路径的一部分”

Android中的“找不到路径的一部分”错误

无法复制文件,找不到路径的一部分

在单元测试用例的 TFS 构建中找不到路径的一部分

使用 Typescript 创建 Firebase 云函数时出现“找不到名称‘ServiceWorkerRegistration’”错误

使用自定义框架时出现“找不到图像”错误