1 特殊路径标示”~” 虚拟路径
(1) ”/表示网站根目录(域名),../表示上级目录,./表示当前目录”等Http标准定位不一样,~是ASP.NET定义的特殊符号,是ASP.NET内部进行推荐的用法,推荐资源定位都使用~从应用根目录开始定义,应用根目录和网站根目录的区别在于:如果将一个应用程序部署到http://www.cnblogs.com/hanyinglong这个目录下面,应用程序的根目录就是Http://www.cnblogs.com/hanyinglong,网站的根目录是:http://www.cnblogs.com(协议+域名(可以有端口))。因此最好用”~”,”~”并不会被浏览器认,因此ASP.NET会将这个路径转换为相对于网站的根目录的全路径在输出到浏览器中。
(2)比如我们有一个 ASP.NET 应用程序叫 CMS,~/ 就是 CMS 的根目录,不论这个 CMS 是放在网站根目录下,还是放在网站 /a 目录下,还是放在网站 /a/b 目录下……输出为 HTML 时,它会自动根据当前文件与目标文件的路径关系,调整为正确的输出路径。
所以说“~/”给我们带来了很多便利,它使得不管我们把应用程序放在哪里,目录都不会出错。
小结:在服务器控件中,将/换成`~/更保险
(3)建立IIS虚拟目录 Test
那么 / 代表IIS根目录
~ 代表Test的根目录, 也就是等于 /Test
(4)~/等于:
<
base
href='<%= this.Request.Url.Scheme + "://" + this.Request.Url.Host + ":" + this.Request.Url.Port + this.Request.ApplicationPath +"/"%>' />
(5)虚拟目录:虚拟目录是指物理上未包含在主目录中的目录,但浏览器却认为该目录包含在主目录中。
2 编程处理”~”
(1) 如果在服务端控件中(使用runat=”server”的控件)会自动将”~”进行转换,如果在HTML控件或者需要在代码中转换的话可以使用VirtualPathUtility类中静态方法进行虚拟路径,全路径等的转换,比如:VirtualPathUtility.ToAbsolute(“~/a/b.aspx”)就是将虚拟路径转换为相对应于应用程序根目录的全路径,也就是”WebSite/a/b.aspx”。
(2) VirtualPathUtility类的主要方法
1) string AppendTrailingSlash(string VirtualPath);如果路径VirtualPath最后没有”/”则添加。
2) string Combine(string basePath,string relativePath);将两个路径进行合并。
3) string GetDirectory(string virtualPath); 返回虚拟路径的目录部分。
4) string MakeRelative(string fromPath,string toPath); 计算两个虚拟路径的相对路径。
5) ToAbsolute:转换为绝对路径。
(3) 举例说明:新建一个Web项目,起名为路径.aspx
<a href="/a.htm">a</a>
<a href="~/b.htm">b</a> 换成这种:Response.Write("<a href='" + VirtualPathUtility.ToAbsolute("~/a/b.htm") + "'>动态</a>" + "<br />");
<asp:HyperLink ID="HyperLink1" runat="server" NavigateUrl="/a.htm">ce1</asp:HyperLink>
<asp:HyperLink ID="HyperLink2" runat="server" NavigateUrl="~/b.htm">ce2</asp:HyperLink>
然后拖放两个HyperLink控件,给两个控件的Text起名为Ce1,ce2,给两个控件的NavigateURl赋值为”/b.htm”,”~/b.htm”。在Page_Load事件下面写入如下代码:
Response.Write(VirtualPathUtility.Combine(VirtualPathUtility.AppendTrailingSlash("~/a/b"), "c.htm"));
3.1 server.mapPath(虚拟路径)
如果网站根目录是 c:\inetpub\wwwroot\
则 path = server.mappath("/nicky/cin.mdb")
如果 网站根目录是 c:\inetpub\wwwroot\nicky\
则 path = server.mappath("cin.mdb")
3.2 Server.MapPath(".") 与 Server.MapPath("./") 的区别
Server.MapPath
点可以理解为当前位置,但不代表当前文件。Server.MapPath(".") 与 Server.MapPath("./") 结果是有小小差别的。
- Server.MapPath(".") 结果形如:D:\wwwroot
- Server.MapPath("./") 结果形如:D:\wwwroot\
顺便说说 Server.MapPath(".\\")(第一个“\”为转义字符),它的结果也形如:D:\wwwroot\,因为在微软的产品中“\”和“/”是等义的。
3.3Server.MapPath返回的路径问题
网站内容如下:
- /1.asp
- /2.asp
- /3/
- /3/1.asp
- /3/2.asp
/3/1.asp 中有句代码:
那么该代码形成的最终路径是指哪个呢?/2.asp 还是 /3/2.asp 呢?
应该是 /3/2.asp,即 Server.MapPath 不受被谁包含的影响。3.4
ASP.NET 路径-你可能不理解 Server.MapPath 中的 ../
举个例子好说一些:
站点 S 的物理路径是 C:\wwwroot。
站点 S 下面具有虚拟目录 V1,V1 的物理路径是 D:\wwwroot。
虚拟目录 V1 下面具有虚拟目录 V2,V2 的物理路径是 E:\wwwroot。
虚拟目录 V2 下面具有目录 F1,F1 的物理路径也就是 E:\wwwroot\F1。
目录 F1 下面具有文件 index.aspx。
- 如果在 index.aspx 中使用 Server.MapPath("../"),那么结果是 E:\wwwroot。
- 如果在 index.aspx 中使用 Server.MapPath("../../"),那么结果是 D:\wwwroot。
- 如果在 index.aspx 中使用 Server.MapPath("../../../"),那么结果是 C:\wwwroot。
- 如果在 index.aspx 中使用 Server.MapPath("../../../../"),那么将出错,因为已经退到站点根目录以上了。