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

40

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

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,因此与服务的会话相同。


1
z: 是否被映射到常规共享或管理共享,例如C $,D $等? - Kev
7个回答

61

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


1
这对我也是答案。我突然在Visual Studio中遇到了以前没有见过的错误,有人遇到了相同的错误并写道,你必须以管理员身份运行VS(我之前从未这样做过,因为我已经是自己计算机上的管理员组成员)。这是第二天,我已经忘记了。对于一个我前一天还能复制的文件,现在出现了路径错误...谢谢Kev! - Andreas Jansson
@AndreasJansson - 很高兴我能够 :) - Kev

17

根据事实,映射的驱动器字母不能使用,简单的解决方法是输入完整的网络路径。

也就是说,

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

所以不要使用

"R:/" + "photos"

而是要使用

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


2
使用完整的网络路径存在一个问题,即它增加了文件路径的长度,例如“R:\ ... \ FileA.txt”可以用于复制、删除等操作,但“\myserver\files\myapp\ ... \ FileA.txt”可能由于路径过长而失败。 - skeletank
这对我没有用。我正在尝试映射Azure文件共享。使用驱动器号,我得到:“找不到路径Q:\的一部分”,如果我使用UNC路径,则会出现:“用户名或密码不正确。” - Dan Csharpster
@DanCsharpster,听起来好像它是在工作。但是您提供了无效的用户名或密码...否则您仍将收到路径未找到的错误提示。 - IAmGroot

5

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


4
UNC路径是对我有效的快速修复方法。对于那些不知道的人,这是一个像这样的路径:\\server1\folder1\folder2\file.pdf - 记住对于C#字符串,你需要像这样转义反斜杠:\\\\server1 - Matt Kemp

3

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


2
你是否在使用Vista/Server 2k8操作系统?这两个操作系统将服务隔离到Session 0,而第一个交互式会话是Session 1。有关Session隔离的更多信息,请参见此处。因此,即使相同的用户用于服务和交互式登录,也会有不同的会话。请注意保留HTML标签。

1

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


0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接