从根目录返回两个文件夹的Server.MapPath

9
以下是我进行操作的步骤:
HttpContext.Current.Server.MapPath(@"~\~\~\Content\")

您好,我知道'.'代表项目的根目录,但如何返回几个文件夹上一级呢?


6
想一下你想要的是 @"..\..\..\Content\" - ediblecode
@danRhul 我收到了错误信息:“您不能使用前导...” - petko_stankoski
5个回答

14

如果您确实需要祖先路径,可以使用Path.GetDirectoryName()从根路径获取它:

string root = Server.MapPath("~");
string parent = Path.GetDirectoryName(root);
string grandParent = Path.GetDirectoryName(parent);

但是你的Web应用程序很可能没有权限读写那里 - 我不确定你打算对此做什么。


2
为什么root、parent和grandParent都返回相同的路径? - petko_stankoski
1
真的吗?我手头没有ASP.NET网站来测试这个,但我在LinqPad中尝试了一个例子,从c:\inetpub\wwwroot\myapp开始,它可以正常工作。如果Path被设置为限制您,我会感到惊讶-毕竟它只是处理一个字符串。因此,虽然我没有在确切的环境中测试过这一点,但如果它不能正常工作,我会感到惊讶的。(现在我意识到我的代码假设根目录没有尾随斜杠-如果存在一个斜杠,您可能需要另一个Path.GetDirectoryName来摆脱它。) - Rup

4
从站点根目录开始,使用~并指定完整路径:~/Archive/Content
由于安全限制,您不能返回到站点根目录之上,详情请参见其他解决方案的这篇文章

IIS故意禁止直接提供站点路径之外的内容。但是,您可以在IIS中创建虚拟目录,并让ISAPI Rewrite指向该目录。例如,创建一个���为/staticfiles的虚拟目录,其指向c:\test\data\static-files。就IIS而言,那就是站点根目录下的一个名为/staticfiles的文件夹。


这对我有什么帮助?它不会回退。 - petko_stankoski
回到哪里?请指定从网站根目录开始的 Content 路径。 - Adriano Repetti
我正在编写的命令所在的文件不在与网站相同的项目中。 - petko_stankoski

4
你可以使用 Parent.Parent.FullName
  string grandParent  = new DirectoryInfo(HttpContext.Current.Server.MapPath("~/")).Parent.Parent.FullName;

1

由于使用了MapPath方法,因此你得到的是从虚拟路径(/)返回的物理路径(\)。

创建DirectoryInfo对象或使用从子应用程序根目录开始的Path实用程序方法,除非您的虚拟父级和虚拟祖先与物理目录结构相同,否则不一定会得到您想要的结果。

我的应用程序的物理层次结构并不嵌套以匹配Url深度。如果涉及虚拟目录,情况也可能是如此。

假设祖父应用程序是两个虚拟文件夹,那么这将为您获取物理路径...

    string physicalGrandparentPath = HttpContext.Current.Server.MapPath("~/../../");

使用此方法可以使您免受IIS设置中进行的任何虚拟目录移动游戏的影响。
我使用了这个方法来测试我能够上升多高。直到我尝试超越wwwroot时,我才收到HttpException。

谢谢,太完美了! - PhilMaGeo

0

最简单的方法,你仍然可以使用以下内容:

string MyFolderName = Server.MapPath("~/AliasName/");

添加一个虚拟目录到你的应用程序。以下是方法:

  • 在Visual Studio中,在根目录下右键点击:
  • 添加 > 新建虚拟目录
  • 别名名称: AliasName
  • 文件夹: 点击 > 浏览...
  • 导航到所需的文件夹,完成。

就这样,现在你可以访问了!


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