目錄與路徑
想像一座圖書館。一本書有名字,但要找到它,你還需要它的位置:哪一層樓、哪一個書架、哪一個格子。檔案系統也一樣。檔名只是書的名字。目錄是放名字的書架。而路徑則是完整的一套指引——一層樓一層樓、一個書架一個書架地——精確釘住某一個檔案。
具體來說,目錄(常稱資料夾)本身是一種特殊的檔案,其內容是一份「名字配對索引節點號碼」的清單——它把每個名字對映到檔案的真實記錄(見「索引節點」)。檔名是某個目錄裡的一個項目;同一個檔案甚至可以在不同目錄底下以好幾個名字出現。路徑是一個字串,它藉由走訪目錄樹來指稱檔案,各層級之間以斜線分隔,像 docs/reports/q3.txt。絕對路徑從根目錄起算,前面帶一個斜線,像 /home/ana/notes.txt,無論你從哪裡執行,它指的都是同一個東西。相對路徑前面沒有斜線,像 ../shared/data.csv,會從你目前的工作目錄開始解讀;特殊名字 .(這個目錄)與 ..(上層目錄)讓你能在相對路徑中四處移動。
為何重要:幾乎每個檔案操作都吃一個路徑,而絕對與相對之分是「找不到檔案」臭蟲的常駐來源——一個在某目錄下能用的相對路徑,當程式從另一目錄啟動時就壞了。知道目錄不過是「名字到索引節點」的對映,也能解釋為何更名或搬移檔案可以瞬間完成(你改的是一個目錄項目,而非檔案的資料),以及為何單一檔案能有好幾個名字。
/home/ana/notes.txt <- 絕對:從任何地方都指同一檔案 notes.txt <- 相對:目前目錄下的 notes.txt ../shared/data.csv <- 相對:往上一層,再進入 shared/
開頭有斜線表示絕對(從根目錄起);沒有斜線表示相對(從你所在處起)。
目錄是個列出名字的檔案;名字並不存在檔案的索引節點裡。所以同一個檔案能有許多名字(硬連結),而程式的相對路徑取決於它目前的工作目錄,這個目錄可用 chdir() 改變——啟動地點很重要。