我与Server.MapPath()
发生了真正的噩梦。当我在我的ASP.NET Development Server中运行的应用程序中调用Server.MapPath("~")
时,它会返回以f:\projects\app1\
之类的反斜杠结尾的根目录,但我在已发布的版本中调用它,安装在IIS中,它返回根目录,没有任何反斜杠,如c:\inetpub\wwwroot\app1
。为什么会这样?怎么可以避免?
我在同一台计算机上执行了2个方案:Windows Server 2008 R2 x64,Visual Studio 2010 x64,IIS 7.
更新
为什么我关心它? Ineed我已经根据文件/文件夹结构编写了一个自定义站点地图提供程序。它提取根目录"~"
的文件/文件夹列表,用Server.MapPath("~")
替换根目录部分,以生成.aspx
文件的URL,以便在ASP.NET Menu
控件中使用。我认为以下代码解释了我在做什么:
string mainRoot = HttpContext.Current.Server.MapPath("~");
DirectoryInfo di = new DirectoryInfo(mainRoot);
//added to solve this problem with Server.MapPath
if (!mainRoot.EndsWith(@"\"))
mainRoot += @"\";
FileInfo[] files = di.GetFiles("*.aspx");
foreach (FileInfo item in files)
{
string path = item.FullName.Replace(mainRoot, "~/").Replace(@"\", "/");
//do more here
}
答案 0 :(得分:6)
可能是在IIS内部设置虚拟目录时,具体取决于在设置时是否使用了斜杠。
但这真的很重要吗?为什么你甚至会关心Server.MapPath("~")
返回的内容?我无法想象你会像那样使用它。更有可能的是,当你真正需要一条路径 in 你的应用程序时:
Server.MapPath("~/Something/Foo.txt");
此外,每当你建立路径时,你应该尝试养成使用Path.Combine的习惯,因为你根本不需要担心尾随斜杠:
string fullPath = Path.Combine(Server.MapPath("~"), @"Something\Foo.txt");