asp.net中的絕對路徑和相對路徑


一、關於相對路徑和絕對路徑
相對路徑轉絕對路徑
一般,我們在ASP.NET網站中往往需要把一個相對路徑轉化為絕對路徑。通常是用Server.MapPath()方法。比如網站根目錄下有 個"Uploads"文件夾,那么我們調用Server.MapPath("Uploads")就會返回這個文件夾在服務器上的絕對路徑,比如 D:\Web1\Uploads。
另一種方法是使用HttpRuntime.AppDomainAppPath,它讀取的就是當前網站的運行目錄。
關於波浪線 ~ :
如果在路徑前加上波浪線“~”則表示從網站根目錄出發的相對路徑。這在引用圖片、CSS的時候比較常用。比如“~\Images”。並且這個路徑同樣可以傳給Server.MapPath()用來返回絕對路徑。
總是從網站跟目錄出發:
在某些場合下,比如網站使用了URL重寫組件(注意,不是指MVC網站),則會引發一些路徑上的問題。比如網站根目錄下有個頁面,而URL重寫中的配置為靜態HTML頁面,這樣就多了兩個路徑。在引用資源文件的時候會有問題。一 種是在后台代碼里用“~\”來獲取根目錄,或者用ResolveUrl()方法。但其實最高效和簡潔的寫法是直接使用一個“/”來表示根目錄。比如<img src="/ 圖片URL">,則不管這個標記在哪個頁面下,它總能找到根目錄下的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”。

四、Server與路徑有關的屬性和方法

1、ApplicationPath 獲取當前應用程序的根目錄路徑,無論在該應用程序中的什么位置請求該路徑。對於此示例,該屬性將返回以下內容:

/
2、CurrentExecutionFilePath 獲取當前請求的虛擬路徑。不同於 FilePath,差別在於如果請求已在服務器代碼中被重定向,則 CurrentExecutionFilePath 就是正確的。對於此示例,該屬性將返回以下內容:

/MyApplication/文件

如果作為對 Transfer 或 Execute 進行調用的結果,您獲取正在運行的代碼中的屬性,則路徑將反映該代碼的位置。
3、FilePath 獲取當前請求的虛擬路徑。對於此示例,該屬性將返回以下內容:

/MyApplication/文件

不同於 CurrentExecutionFilePath,FilePath 不反映服務器端轉換。
4、Path 獲取當前請求的虛擬路徑。對於此示例,該屬性將返回以下內容:

/MyApplication/文件

5、PhysicalApplicationPath 獲取當前正在執行的應用程序的根目錄的物理文件系統路徑。對於此示例,該屬性將返回以下內容:

C:\inetpub\wwwroot\
6、PhysicalPath 獲取與請求的 URL 對應的物理文件系統路徑。對於此示例,該屬性將返回以下內容:

C:\inetpub\wwwroot\MyApplication\MyPages\default.aspx

7、使用 MapPath 方法 MapPath 方法返回傳遞給該方法的虛擬路徑的完整物理路徑。例如,以下代碼返回網站根目錄的文件路徑:

String rootPath = Server.MapPath("~");

注意 傳遞給 MapPath 方法的路徑必須為應用程序相對路徑,而不是絕對路徑。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM