Directory.Exists 用于 ASP.NET 中的网络路径

Posted

技术标签:

【中文标题】Directory.Exists 用于 ASP.NET 中的网络路径【英文标题】:Directory.Exists for network paths in ASP.NET 【发布时间】:2016-03-02 20:57:23 【问题描述】:

我想得到:

Directory.Exists(@"E:\subdirectory")

当 E: 是持久映射网络驱动器时,从 ASP.NET 运行时返回“true”。我使用以下命令从在我的用户上下文下运行的命令行映射它,它成功返回并且不提示输入凭据:

net use E: \\servername\sharename /persistent:yes

此时我完全在本地运行。

当我从控制台应用程序或 linqpad 运行 Directory.Exists 行时,它返回 true。当我从在 IIS(not IIS express)下运行的 ASP.NET 应用程序运行它时,它返回 false。

我已更改我的应用程序池以使用我在本地运行的相同用户帐户。我已通过以下方式验证这已生效:

检查我的 Windows 进程列表并确保 w3wp.exe 在我的用户帐户下运行。 将我的 ASP.NET 应用程序附加到 w3wp.exe 并设置断点,然后检查 Environment.UserName 和 Environment.UserDomainName 以验证我是否在我的用户帐户的上下文中运行。

但是,我的 ASP.NET 应用程序在检查网络共享时仍然返回 false。

这是为什么?

【问题讨论】:

您是否尝试过使用 Server.MapPath? Directory.Exists(Server.MapPath(@"E:\subdirectory")); I think I have a unique problem. 非常幼稚.. :) @Kramb,谢谢,但这会引发异常:'E:/subdirectory' 是物理路径,但应该是虚拟路径。 @Eser 澄清一下,我发现的所有线程都围绕共享不起作用,因为人们没有在正确的用户上下文中运行 IIS。据我所知,我是在正确的用户环境下运行的。 @tarun713 查看(并使用)msdn.microsoft.com/en-us/library/windows/desktop/… 【参考方案1】:

映射的网络驱动器与用户会话相关联。 IIS 在会话 0 中运行,您的映射驱动器很可能在会话 1 中运行。

当您为会话创建网络驱动器时,我不知道有任何方法可以让其他会话显示网络驱动器,我认为您不需要使用 E:\ 而是使用 \\servername\sharename 作为路径。

【讨论】:

这确实有效,但映射的驱动器不应该在任何会话中持续存在吗?因为我将其标记为持续存在? 不,如果您结束会话,persist 只会重新映射,然后使用同一用户开始新的会话。 如果你真的想要,here is a hack 可以让你在会话 0 中执行net use E: \\servername\sharename /persistent:yes,这样它将在该会话中持续存在。风险自负,我真的建议您不要使用它,而只需使用网络路径。

以上是关于Directory.Exists 用于 ASP.NET 中的网络路径的主要内容,如果未能解决你的问题,请参考以下文章

在Directory.Delete Directory.Exists有时返回true?

Directory.Exists - 访问被拒绝 C# 的 UNC 路径

文件系统路径和 Directory.Exists()

Test-Path / System.IO.Directory::Exists 未按预期工作

步步为营-15-文件夹的操作

C# 文件操作常用方法总结