2012-03-15 113 views
6

这里有两个文件夹,后面是我如何做到这一点:使用Server.Mappath去从根本

HttpContext.Current.Server.MapPath(@"~\~\~\Content\") 

HI知道“”是为项目的根源,但如何去回几个文件夹?

+5

认为你想'@“.. \ .. \ .. \ Content \” – ediblecode 2012-03-15 18:09:20

+0

@danRhul我得到错误“你不能使用领先...” – 2012-03-15 18:10:17

+0

这是为了安全。 – 2012-03-15 18:10:49

回答

9

如果你真的需要祖父路径,可以使用​​3210从根路径得到它:

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

但是你的web应用程序很可能将没有权限来读取或写入那里 - 我我不确定你会用它做什么。

+2

root,parent和grandParent都返回相同的路径。为什么? – 2012-03-15 18:22:32

+1

真的吗?我没有一个ASP.NET站点来进行测试,但我在LinqPad中尝试了一个例子,从c:\ inetpub \ wwwroot \ myapp开始,它工作正常。如果Path被设置为限制你 - 毕竟它只是处理一个字符串,我会感到惊讶。所以我没有在确切的环境中测试过它,但如果它不工作,我感到很惊讶。 (我现在意识到我的代码假设root没有结尾的斜杠 - 如果存在的话,你可能需要另外一个Path.GetDirectoryName来摆脱它。) – Rup 2012-03-15 18:27:06

3

~的网站根目录开始,并指定完整路径:~/Archive/Content

由于安全限制,您不能回到站点根目录以上,另请参阅this article从其他解决方案。

IIS有目的地阻止直接在站点路径之外提供内容。但是,您可以在IIS中创建一个虚拟目录,并将ISAPI重写指向该目录。例如,创建一个名为/ staticfiles的指向c:\ test \ data \ static-files的虚拟目录。就IIS而言,这直接离开了名为/ staticfiles的文件夹中的站点根目录。

+0

这对我有帮助吗?它不会回头。 – 2012-03-15 18:15:59

+0

回到哪里?从网站根目录开始指定** Content **的路径。 – 2012-03-15 18:33:05

+0

我写命令的文件与网站不在同一个项目中。 – 2012-03-15 20:05:19

3

由于您使用的MapPath你正在返回从虚拟路径(/)的物理路径(\)可以使用Parent.Parent.FullName

string grandParent = new DirectoryInfo(HttpContext.Current.Server.MapPath("~/")).Parent.Parent.FullName; 
0

创建DirectoryInfo对象或使用从您的子应用程序根开始的Path实用工具方法不一定会给您所期望的,除非您的虚拟父级和虚拟祖父级具有与您的物理目录结构相同的层级。

我的应用程序没有物理嵌套以匹配Url深度。如果涉及虚拟目录,情况也可能如此。

假设祖父母的应用程序是两个虚拟文件夹了,这将让你的物理路径...

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

使用,这将让你从任何虚拟目录洗牌游戏在IIS安装正在进行安全。

我用这个来看看我能走多远。我没有得到一个HttpException,直到我试图超过wwwroot。