天天看點

Nodejs基礎:路徑處理子產品path總結

在nodejs中,path是個使用頻率很高,但卻讓人又愛又恨的子產品。部分因為文檔說的不夠清晰,部分因為接口的平台差異性。

将path的接口按照用途歸類,仔細琢磨琢磨,也就沒那麼費解了。

擷取路徑:path.dirname(filepath)

擷取檔案名:path.basename(filepath)

擷取擴充名:path.extname(filepath)

例子如下:

嚴格意義上來說,path.basename(filepath) 隻是輸出路徑的最後一部分,并不會判斷是否檔案名。

但大部分時候,我們可以用它來作為簡易的“擷取檔案名“的方法。

如果隻想擷取檔案名,單不包括檔案擴充呢?可以用上第二個參數。

簡單的例子如下:

更詳細的規則是如下:(假設 path.basename(filepath) === b )

從b的最後一個<code>.</code>開始截取,直到最後一個字元。

如果b中不存在<code>.</code>,或者b的第一個字元就是<code>.</code>,那麼傳回空字元串。

path.join([...paths])

path.resolve([...paths])

把<code>paths</code>拼起來,然後再normalize一下。這句話反正我自己看着也是莫名其妙,可以參考下面的僞代碼定義。

path定義的僞代碼如下:

這個接口的說明有點啰嗦。你可以想象現在你在shell下面,從左到右運作一遍<code>cd path</code>指令,最終擷取的絕對路徑/檔案名,就是這個接口所傳回的結果了。

比如 <code>path.resolve('/foo/bar', './baz')</code> 可以看成下面指令的結果

更多對比例子如下:

path.parse(path)

從官方文檔的描述來看,path.normalize(filepath) 應該是比較簡單的一個api,不過用起來總是覺得沒底。

為什麼呢?api說明過于簡略了,包括如下:

如果路徑為空,傳回<code>.</code>,相當于目前的工作路徑。

将對路徑中重複的路徑分隔符(比如linux下的<code>/</code>)合并為一個。

對路徑中的<code>.</code>、<code>..</code>進行處理。(類似于shell裡的<code>cd ..</code>)

如果路徑最後有<code>/</code>,那麼保留該<code>/</code>。

in other words, path.normalize is "what is the shortest path i can take that will take me to the same place as the input"

代碼示例如下。建議讀者把代碼拷貝出來運作下,看下實際效果。

path.format(pathobject):将pathobject的root、dir、base、name、ext屬性,按照一定的規則,組合成一個檔案路徑。

path.parse(filepath):path.format()方法的反向操作。

我們先來看看官網對相關屬性的說明。

首先是linux下

然後是windows下

閱讀相關api文檔說明後發現,path.format(pathobject)中,pathobject的配置屬性是可以進一步精簡的。

根據接口的描述來看,以下兩者是等價的。

<code>root</code> vs <code>dir</code>:兩者可以互相替換,差別在于,路徑拼接時,<code>root</code>後不會自動加<code>/</code>,而<code>dir</code>會。

<code>base</code> vs <code>name+ext</code>:兩者可以互相替換。

path.format(pathobject) 的反向操作,直接上官網例子。

四個屬性,對于使用者是挺便利的,不過path.format(pathobject) 中也是四個配置屬性,就有點容易搞混。

接口:path.relative(from, to)

描述:從<code>from</code>路徑,到<code>to</code>路徑的相對路徑。

邊界:

如果<code>from</code>、<code>to</code>指向同個路徑,那麼,傳回空字元串。

如果<code>from</code>、<code>to</code>中任一者為空,那麼,傳回目前工作路徑。

上例子:

以下屬性、接口,都跟平台的具體實作相關。也就是說,同樣的屬性、接口,在不同平台上的表現不同。

path.posix:path相關屬性、接口的linux實作。

path.win32:path相關屬性、接口的win32實作。

path.sep:路徑分隔符。在linux上是<code>/</code>,在windows上是<code>\</code>。

path.delimiter:path設定的分割符。linux上是<code>:</code>,windows上是<code>;</code>。

注意,當使用 path.win32 相關接口時,參數同樣可以使用<code>/</code>做分隔符,但接口傳回值的分割符隻會是<code>\</code>。

直接來例子更直覺。

linux系統例子:

windows系統例子: