讀了
path
子產品的文檔,研究了幾個有意思的問題:
- ?️ 路徑片段分隔符 vs 路徑定界符
- ?️
vspath.join()
path.resolve()
- ?️ Windows vs Posix
引用/轉載 請聲明出處:原文連結: xxoo521.com
路徑片段分隔符 vs 路徑定界符
path.sep
,是路徑片段分隔符。它在 Windows 上是
\
,在 Unix 上是
/
。它用于指定檔案(夾)的路徑中。
path.delimiter
,是路徑定界符。它在 Windows 上是
;
,在 Unix 上是
:
。它用于分割多個路徑。因為在系統變量裡,多個路徑是被拼接為一個字元串存儲(不是數組集合)。
例如,如果想擷取所有可執行程式的搜尋路徑,代碼如下:
const path = require("path");
/**
* @return {string[]}
*/
function getAllPaths() {
const paths = process.env.PATH.split(path.delimiter);
return paths;
}
複制
path.join()
vs path.resolve()
path.join()
path.resolve()
兩者的相同點是:都會使用系統的分隔符将“路徑片段”進行拼接。
兩者的不同點在于:
path.join()
隻是拼接路徑,
path.resolve()
會将拼接好的路徑轉換成絕對路徑。
const path = require("path");
console.log("工作目錄是:", process.cwd());
console.log("目前工作目錄下的tmp.js路徑", path.join(".", "tmp.js"));
console.log("目前工作目錄下的tmp.js絕對路徑", path.resolve(".", "tmp.js"));
複制
上面這段代碼的的結果是:
工作目錄是: /Users/yuanxindong/Desktop/articles/xxoo521
目前工作目錄下的tmp.js路徑 tmp.js
目前工作目錄下的tmp.js絕對路徑 /Users/yuanxindong/Desktop/articles/xxoo521/tmp.js
複制
Windows vs Posix
POSIX: Portable Operating System Interface,可移植作業系統接口。是 IEEE 為要在各種 UNIX 作業系統上運作軟體,而定義 API 的一系列互相關聯的标準的總稱。Linux 基本實作 POSIX 相容,Windows 部分實作。(來源:維基百科:可移植作業系統接口)
Posix 的主要目的是在源碼層面提供給開發者統一的作業系統 API。它本身是一個規範,但是系統沒保證一定落實(類似 ES6 規範和 IE 的關系)。
由于在 Windows 和 Posix 上,針對 path 的一些規範不相同(例如分隔符),是以相同的 api+相同的參數,在兩種平台上的調用結果可能不一樣。
為了解決這個問題,nodejs 也提供了
path.win32
和
path.posix
來解決這個問題。
例如,我在我的 mac 上想解析一段 windows 路徑格式的資料,拿到它的 basename。代碼如下:
const path = require("path");
console.log(path.basename("C:\\temp\\myfile.html")); // output: C:\temp\myfile.html
console.log(path.win32.basename("C:\\temp\\myfile.html")); // output: myfile.html
複制
對比結果,第一種是錯誤的,因為本機是 mac。這兩種接口,在處理跨平台的檔案路徑時候,有很大作用。