標籤:
很多人對它們都不陌生,在眾多的WEB程式中,使用Server.MapPath和Request.PhysicalApplicationPath來操作目錄/檔案的幾率參半,我曾經也經常混用,然而時間久了。發現Request.PhysicalApplicationPath有點“麻煩”?
其實在一般的應用程式中,感覺不到兩者的區別,而在一些存在“虛擬目錄”、存在多級子目錄、需要虛擬目錄相互檔案操作的網站中,就可以知道它們的區別了。我的總結如下:
1、相對當前路徑的檔案操作:
可以使用Server.MapPath("test.txt")、Server.MapPath("a/test.txt")、Server.MapPath("../b/test.txt"),這個時候使用Request.PhysicalApplicationPath就很難定位到檔案;
2、絕對路徑的檔案操作:
這個時候兩者都可以,有點注意的是Server.MapPath中的絕對是“面向”網站而言的,不會因為“虛擬目錄”本身的屬性不同而變化,Request.PhysicalApplicationPath就並非如此。
打個比方:主要站台指向D:\wwwroot\,虛擬目錄指向E:\wwwroot\a\,取名為a。
那麼如果我要操作虛擬目錄下的E:\wwwroot\a\test.txt,可以使用Server.MapPath("/a/test.txt"),又或者直接使用Server.MapPath("~/test.txt");
那麼用Request.PhysicalApplicationPath該怎麼寫?
很多人數是:Request.PhysicalApplicationPath + "test.txt",我說不一定,為什嗎?
因為要是該虛擬目錄有單獨的應用池,Request.PhysicalApplicationPath就是E:\wwwroot\a\,後面加上test.txt就是E:\wwwroot\a\test.txt;
但要是該虛擬目錄沒有單獨的應用池,Request.PhysicalApplicationPath就是D:\wwwroot\,不管你後面怎麼加,都定位不到我要找到檔案了。呵呵……
3、跨虛擬目錄的檔案操作:
比如我現在要操作虛擬目錄b下的test2.txt檔案,使用Server.MapPath("/b/test2.txt")就沒有問題(前提是我有操作許可權,沒有許可權是另外一回事)。
而Request.PhysicalApplicationPath根本就無法找到其他的虛擬目錄下的檔案,不信誰試試,再告訴我方法?!!!
Server.MapPath和Request.PhysicalApplicationPath的異同