在.NET Web应用程序中获取当前目录

127

我有一个网站项目,我想使用c#方法Directory.GetCurrentDirectory()获取网站根目录。我不想使用静态路径,因为文件位置将来可能会更改。此方法在我的imageProcess.aspx.cs文件中运行,但我原以为它会返回:

C:\Users\tcbl\documents\visual studio 2010\Projects\ModelMonitoring\ModelMonitoring\imageProcess.aspx.cs

我得到的是:

C:\Program Files\Common Files\Microsoft Shared\DevServer\10.0\

有没有人能够解释一下为什么会发生这种情况,以及可能的解决方案是什么呢?非常感谢。


这里有一个相关的帖子链接,讨论了一般情况下 .Net 应用程序的执行路径。 - RBT
另一篇文章讨论了 .Net Web 应用程序中的服务器映射路径问题。 - RBT
3个回答

235

当前目录是一个系统级别的特性,它返回服务器启动的目录。它与网站无关。

您需要使用 HttpRuntime.AppDomainAppPath

如果您在 HTTP 请求中,还可以调用 Server.MapPath("~/Whatever")


5
谢谢。实际上我在寻找 HttpRuntime.BinDirectory,但一旦我尝试了你在回答中提到的方法,在调试器中这很容易确定。请帮我翻译: - Kent Weigel
如果我使用Server.MapPath("~Whatever"),并且IIS站点托管在http://myserver上。我得到的是C:\\somefolder\Whatever,而不是http://myserver/Whatever文件夹。 - Si8
@Si8:是的,这就是Server.MapPath的作用。你想要的是http://stackoverflow.com/q/5823847/34397。 - SLaks
2
如果您不熟悉.NET程序集(或者在Immediate Window中),完整的命令是System.Web.HttpRuntime.AppDomainAppPathSystem.Web.HttpRuntime.HttpContext.Server.MapPath("~") - testpattern
3
HttpContext是System.Web.HttpContext.Current.Server.MapPath("~"),而不是HttpRuntime。 - chengzi
在静态方法中,请使用HostingEnvironment.MapPath(“~”)代替。 - Rob

125

使用此代码:

 HttpContext.Current.Server.MapPath("~")

详细参考:

Server.MapPath指定相对或虚拟路径映射到物理目录。

  • Server.MapPath(".")返回正在执行的文件(例如aspx)的当前物理目录
  • Server.MapPath("..")返回父目录
  • Server.MapPath("~")返回应用程序根目录的物理路径
  • Server.MapPath("/")返回域名根目录的物理路径(不一定与应用程序的根目录相同)

一个例子:

假设您将网站应用程序(http://www.example.com/)指向:

C:\Inetpub\wwwroot

并已将您的商店应用程序安装在(IIS中的虚拟目录下,标记为应用程序)


D:\WebApps\shop
例如,在以下请求中调用Server.MapPath
http://www.example.com/shop/products/GetProduct.aspx?id=2342

那么:

Server.MapPath(".") returns D:\WebApps\shop\products
Server.MapPath("..") returns D:\WebApps\shop
Server.MapPath("~") returns D:\WebApps\shop
Server.MapPath("/") returns C:\Inetpub\wwwroot
Server.MapPath("/shop") returns D:\WebApps\shop
如果路径以斜杠 (/) 或反斜杠 () 开始,MapPath 方法返回的路径将是虚拟路径的完整路径。
如果路径不以斜杠开头,则MapPath方法返回相对于正在处理请求的目录的路径。
注意:在C#中,“@”是一种直接的文本字符串操作符,意味着该字符串应该“按原样”使用,而不应该处理转义序列。
脚注: Server.MapPath(null)Server.MapPath("") 也会产生这个效果。

26
完美复制 https://dev59.com/v3VC5IYBdhLWcg3wfxM8 这段代码是用于获取服务器上文件路径的,其中Server.MapPath() 方法会将相对路径转换为绝对路径。多个 Server.MapPath() 嵌套使用时,每一个嵌套都将返回前一个嵌套返回路径的完整形式。最终返回的路径是该文件在服务器上的实际路径。 - GGO
4
好的链接!跟着链接,我最终使用了 System.Web.Hosting.HostingEnvironment.MapPath("~"),这个方法非常好用,不依赖于 System.Web.HttpContext.Current - Max Barraclough

8

对于dot net 6,我使用:

AppContext.BaseDirectory

最酷的事情是它在 asp.net 和控制台应用程序上都是相同的。


字符串 baseDirectory = AppContext.BaseDirectory;// 它返回 bin 路径,例如 D:\WebMVCApp1\bin\Debug\netcoreapp3.1\ - Toan NC

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