关于相对路径和绝对路径


相对路径转绝对路径

一般,我们在ASP.NET网站中往往需要把一个相对路径转化为绝对路径。通常是用Server.MapPath()方法。比如网站根目录下有个"Uploads"文件夹,那么我们调用Server.MapPath("Uploads")就会返回这个文件夹在服务器上的绝对路径,比如D:\Web1\Uploads。

另一种方法是使用HttpRuntime.AppDomainAppPath,它读取的就是当前网站的运行目录。

关于波浪线:

如果在路径前加上波浪线“~”则表示从网站根目录出发的相对路径。这在引用图片、CSS的时候比较常用。比如“~\Images”。并且这个路径同样可以传给Server.MapPath()用来返回绝对路径。

总是从网站跟目录出发:

在某些场合下,比如网站使用了URL重写组件(注意,不是指MVC网站),则会引发一些路径上的问题。比如网站根目录下有个ReadBlog.aspx,而URL重写中的配置为/Blog/View/xxxx.html,这样就多了两个路径。在引用资源文件的时候会有问题。一种是在后台代码里用“~\”来获取根目录,或者用ResolveUrl()方法。但其实最高效和简洁的写法是直接使用一个“/”来表示根目录。比如:

<img src="/Images/shit.png" alt="" />

则不管这个标记在哪个页面下,它总能找到根目录下的Images文件夹下的shit.png。

斜杠和反斜杠


URL使用的是“/”,所以在处理URL(解析和转向)的时候,都得给用户返回“/”这个方向的斜杠。

Windows中使用的是“\”,因此在做IO操作,比如把用户上传的文件保存到硬盘的时候得用“\”这个方向的斜杠。

其实这里会有个问题,比如我要把网站的图片上传文件夹的路径做成可配置的。那我到底是在配置文件中写“\Uploads”还是“/Uploads”呢?毕竟这个常量需要同时给URL和程序去读。当然,你可以在程序里做进一步的处理,但这种做法是否妥当呢?我现在还不清楚。

路径的拼接


最简单的拼接就是两个字符串用“+”操作符拼起来。遇到已知的路径,这种做法是木有问题的。但有时候我们获取的变量并不好控制。虽然可能经过验证逻辑处理,但验证并不总是灵活的。比如这个路径:“Uploads”,它和“Uploads\”意义是一样的。但如果直接用字符串相加把这个路径和另一个拼起来,比如“2011”,显然就会有问题:前者少一个斜杠:Uploads2011,而我们需要的结果是Uploads\2011。

这时候我们需要借助System.IO.Path类中的Combine方法来做这件事。下面两条语句返回的结果都是一样的:

Path.Combine(@"Uploads", "2011");
Path.Combine(@"Uploads\", "2011");

结果都是:Uploads\2011

注意,不要在第二个参数前加“\”,比如把第二个参数换成“\2011”,返回值就会变成“\2011”,丢失了“Uploads”。