1. 程式人生 > >windows下檔案路徑與Linux下檔案路徑的比較

windows下檔案路徑與Linux下檔案路徑的比較

Windows路徑是我們經常使用的東西,它看似簡單,實際上隱含許多細節,這些都是在平常的使用過程中注意不到的。下面讓我們來看看各種各樣的Windows路徑。

提起路徑,我們都會想到“絕對路徑”和“相對路徑”,實際上絕對路徑是一個廣泛的概念,它表示的是可以唯一定位一個檔案或資料夾的路徑,有多種形式的路徑都屬於絕對路徑的範疇,例如:

完整路徑(Full path)

我們平時所說的“絕對路徑”通常就是指完整路徑,它的格式如下:

C:\Windows\System32\calc.exe

UNC(Universal Naming Convention通用命名規範)路徑

UNC路徑用於在區域網上定位檔案或資料夾,在通過網路上的芳鄰訪問其它系統上的共享檔案時使用的就是UNC路徑。UNC路徑的格式如下:

\\PC101\ShareFiles\job.doc

其中PC101是目標系統的計算機名,ShareFiles是目標系統上的共享資料夾名稱。

以\\?\開頭的路徑

在某些手工輔助防毒的工具中可以看到以\\?\開頭的路徑,這種路徑我還找不到正式的名稱。完整路徑和UNC路徑都可以以\\?\開頭:

\\?\C:\Windows\System32\calc.exe

\\?\UNC\PC101\ShareFiles\job.doc

相對路徑(Relative path)

上面四種路徑都可以在本地或網路上絕對定位一個檔案,因此屬於絕對路徑。另一種我們常常使用的是相對路徑,這種路徑需要與程序的當前資料夾(Current directory)一起合作才可以定位一個檔案或資料夾。程序的當前資料夾並不是指EXE檔案所在的資料夾,它是每個程序都有的一個屬性。例如在命令提示符中顯示的路徑就是這個cmd.exe程序的當前資料夾,使用cd命令可以改變當前資料夾,無論當前資料夾如何改變,cmd.exe檔案所在的資料夾總是不變的。在程序啟動的時候可以指定它的當前資料夾,例如在快捷方式的屬性中有一個“起始位置”輸入框,這個就是程序啟動後的當前資料夾。如果在啟動時不指定程序的當前資料夾(直接雙擊EXE檔案的情況),那麼EXE檔案的所在資料夾就會作為它的當前資料夾。

純粹的相對路徑格式如下:

Windows\System32\calc.exe

要注意的是相對路徑的開頭不能有\,很多人以為有沒有\都是一樣的,其實不然,以\開頭的路徑是另外一種路徑,下文會詳細介紹這種路徑。

如果在程序中操作檔案時傳遞一個相對路徑,那麼程序會將當前資料夾的路徑與這個相對路徑合併,得到一個完整路徑。例如命令提示符的當前資料夾是C:\Windows,如果執行start System32\calc.exe命令,程式就會將兩個路徑合併得到C:\Windows\System32\calc.exe。

由於這樣的特性,當前資料夾又稱為工作資料夾,因為程序使用相對路徑時都是針對該資料夾的。

除了上面所說的純粹的相對路徑,還有兩種特殊的相對路徑,為了不至於混淆,不再將它們稱為相對路徑。

以\開頭的路徑

上面說過相對路徑不能以\開頭,一旦如此,它就表示相對於當前資料夾根目錄的路徑。例如程序的當前資料夾是C:\Windows,那麼\System32\calc.exe就表示C:\System32\calc.exe。不論當前資料夾的路徑有多深,只取根目錄進行合併。可以在命令提示符中進行驗證:首先將C:\Windows設定為當前資料夾,然後執行start \System32\calc.exe命令,將會提示錯誤,所找不到檔案。再執行start \Windows\System32\calc.exe命令,這時計算器程式成功啟動了,證明了上面的說法。

以碟符和冒號開頭的路徑

這種路徑就像是拼寫錯誤的完整路徑,它的格式如下:

C:System32\calc.exe

碟符加冒號是一種特殊的表示法,表示的是程序在“該分割槽上的當前資料夾”。這裡又蹦出來了一個當前資料夾,這與上文的當前資料夾是不同的。簡單來說,對於每一個分割槽,程序都會儲存在這個分割槽上最後使用的當前資料夾。可能解析的不夠好,那麼可以使用命令提示符來操作一遍以加深理解。

執行cmd,執行cd /d C:\Windows\System32命令進入該資料夾,然後切換到其它的分割槽,再執行C:calc.exe命令,可以看到計算器程式啟動了。

我們在執行cd命令進入C:\Windows\System32資料夾後,程序便以此為當前資料夾,當切換到其餘的分割槽時,程序先將這個資料夾的路徑儲存起來,再進行切換。使用碟符和冒號的形式讀取指定分割槽上的當前資料夾。

路徑中的限制

除了路徑格式上的限制,還有很多字元上的限制,下面一一來看看各種路徑有什麼限制。

除了以\\?\開頭的路徑之外,其它路徑的長度都不能超過260個字元(包括結尾的\0字元),而\\?\開頭的路徑長度可以達到約32000個字元(系統在處理\\?\字首的時候可能將它擴充套件成更長的字串)。網路上流傳的一則技巧:檔案路徑太長而不能被刪除,可以在執行del命令時在路徑前加上\\?\字首。

檔案或資料夾名稱的最後一個字元不能為空格或句點。但在路徑中,最後一個字元可以為句點,因為路徑中的句點表示的是當期資料夾(這與上文的當前資料夾完全不同),兩個句點表示的是上一級資料夾。以\\?\開頭的路徑中不能使用句點表示當前資料夾或上一級資料夾,在資源管理器的位址列中雖然可以這麼做,那是因為資源管理器對其作了處理。

檔案或資料夾名稱不能包含的字元 :

< > : " / \

? *

在路徑中可以使用 : \ ?,冒號是與碟符一起使用的,問號是\\?\字首中特有的,除此之外不能出現這兩個字元;而\是資料夾分割符。雖然我們也能使用/作為分隔符,實際上這是不允許的,系統在處理路徑時會將/替換成\。另外,如果路徑最後一個字元是\,那麼該路徑表示的是資料夾;否則表示的是一個檔案。

UNC路徑的計算機名部分不能出現以下字元:

` ~ ! @ # $ % ^ & * ( ) = + _ [ ] { } \

; : . ‘ “ , < > / ?

確實是夠多的了,實際上標準的計算機名推薦只使用26個英文字母、10個數字以及-(連字元),否則可能會出現找不到計算機的情況。在更改計算機名的時候如果出現非標準字元,系統會作出提示。

在Unix/Linux和windows中檔案路徑的表示方法是不一樣的,在Unix/Linux中,路徑的分隔採用正斜槓"/",比如"/home/fzu";而在Windows中,路徑分隔採用反斜槓"",比如"D:\tools\eclipse"。

此外,由於編譯器的字串解析中還涉及到轉義字元的問題,經常會出現莫名其妙的錯誤,所以為了避免這樣不必要的麻煩,windows下的路徑經常會用雙反斜槓來表示,不管解析引擎是否將反斜槓解析成轉義字元,最終在記憶體中得到的都是"",因此寫成"D:\\tools\\eclipse"是不會出問題的。

linux相對路徑的表示:

. 表示使用者所處的當前目錄;

.. 表示上級目錄;

_ 表示前一個工作目錄;

~ 表示當前使用者自己的根目錄;

~account 表示[account]這個使用者的根目錄。