如何使用 System.IO.DirectoryInfo 访问映射的网络驱动器?

Posted

技术标签:

【中文标题】如何使用 System.IO.DirectoryInfo 访问映射的网络驱动器?【英文标题】:How can I access a mapped network drive with System.IO.DirectoryInfo? 【发布时间】:2008-09-25 14:24:26 【问题描述】:

我需要在映射的网络驱动器上创建一个目录。我正在使用代码:

DirectoryInfo targetDirectory = new DirectoryInfo(path);
if (targetDirectory != null)

    targetDirectory.Create();

如果我指定“\\\\ServerName\\Directory”之类的路径,一切正常。如果我将“\\ServerName\Directory”映射为,例如驱动器 Z:,并指定“Z:\\”之类的路径,则会失败。

创建 targetDirectory 对象后,VS 显示(在调试模式下)targetDirectory.Exists = false,并且尝试执行 targetDirectory.Create() 会引发异常:

System.IO.DirectoryNotFoundException: "Could not find a part of the path 'Z:\'."

但是,相同的代码适用于本地目录,例如C:。

该应用程序是 Windows 服务(WinXP Pro、SP2、.NET 2),在与映射驱动器的用户相同的帐户下运行。 Qwinsta 回复说用户的会话是会话 0,所以它和服务的会话是同一个会话。

【问题讨论】:

Is z: 肯定被映射到常规共享或管理共享,例如C$、D$ 等 【参考方案1】:

映射的网络驱动器是特定于用户的,因此如果应用程序在与创建映射驱动器号 (z:) 的用户不同的身份下运行,它将无法工作。

【讨论】:

这也是我的答案。我突然在 Visual Studio 中遇到了以前从未见过的错误,遇到同样错误的人写道,您必须以管理员身份运行 VS(我认为我以前从未做过,因为是管理员组的一部分已经在我自己的电脑上)。这是后天,我忘记了。为我可以在前一天复制的文件获取此路径错误...谢谢 Kev! @AndreasJansson - 很高兴我能 :)【参考方案2】:

基于事实,映射驱动器号不起作用,简单的解决方案是输入完整的网络路径。

阿卡,

我的R:/ 驱动器被映射到\\myserver\files\myapp\

所以而不是使用

"R:/" + "photos"

使用

"\\myserver\files\myapp\" + "photos"

【讨论】:

使用完整网络路径的一个问题是它增加了文件路径的长度,因此“R:\...\FileA.txt”可能适用于复制、删除等,但是"\\myserver\files\myapp\...\FileA.txt" 可能会因为路径太长而失败。 这对我不起作用。我正在尝试映射 Azure 文件共享。使用我得到的驱动器号:“找不到路径 Q:\ 的一部分”,如果我使用 UNC 路径,我得到:“用户名或密码不正确。” @DanCsharpster 在我看来它正在工作。但是您提供的用户名或密码无效...否则您将无法找到路径。【参考方案3】:

运行您的应用程序的帐户可能无权访问映射的驱动器。如果这是一个 Web 应用程序,那肯定是问题...默认情况下,一个 Web 应用程序在 NETWORK SERVICE 帐户下运行,该帐户没有任何映射驱动器设置。尝试使用模拟来查看它是否可以解决问题。尽管您可能需要找出比仅使用模拟更好的解决方案。如果是我,我会坚持使用 UNC 路径。

【讨论】:

UNC 路径是对我有用的快速修复。对于那些不知道的人,这是这样的路径:\\server1\folder1\folder2\file.pdf - 请记住,对于 c# 字符串,您需要像这样 \\\\server1转义反斜杠>【参考方案4】:

您是否使用与程序运行时完全相同的凭据进行映射?

【讨论】:

【参考方案5】:

您是否在 Vista/Server 2k8 上运行?这两个都将服务隔离到会话 0 中,第一个交互式会话是会话 1。有关会话隔离的更多信息 here。因此,即使是同一用户同时用于服务和交互式登录,也会是不同的会话。

【讨论】:

【参考方案6】:

您可以尝试使用WNetConnection 将映射的驱动器解析为网络路径。

【讨论】:

非常有帮助,谢谢【参考方案7】:

我在 Win Server 2012 上遇到了同样的问题。禁用 UAC 解决了它。

【讨论】:

以上是关于如何使用 System.IO.DirectoryInfo 访问映射的网络驱动器?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用本机反应创建登录以及如何验证会话

如何在自动布局中使用约束标识符以及如何使用标识符更改约束? [迅速]

如何使用 AngularJS 的 ng-model 创建一个数组以及如何使用 jquery 提交?

如何使用laravel保存所有行数据每个行名或相等

如何使用 Math.Net 连接矩阵。如何使用 Math.Net 调用特定的行或列?

WSARecv 如何使用 lpOverlapped?如何手动发出事件信号?