在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系統例子: