首頁 >web前端 >js教程 >Node.js中路徑處理模組path的介紹

Node.js中路徑處理模組path的介紹

不言
不言原創
2018-06-30 10:07:021439瀏覽

這篇文章主要介紹了Node.js中路徑處理模組path的介紹,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下

相信大家都知道在在 nodejs中,path是個使用頻率很高,但卻讓人又愛又恨的模組。因為部分文檔說的不夠清晰,還有部分因為介面的平台差異性。本文就給大家詳細介紹下關於Node.js中的路徑處理模組path,希望能對大家學習或使用模組path有幫助,下面來一起看看吧。

前言

在node.js中,提供了一個path某塊,在這個模組中,提供了許多使用的,可被用來處理與轉換路徑的方法與屬性,將path的介面依照用途歸類,仔細琢磨琢磨,也就沒那麼費解了。下面我們就來詳細介紹下關於Node.js中的路徑處理模組path。

取得路徑/檔案名稱/副檔名

#     取得路徑:path.dirname(filepath)<br>

     取得檔案名稱:path.basename(filepath)<br>

     取得副檔名:path.extname(filepath)<br>

取得所在路徑

#範例如下:

var path = require(&#39;path&#39;);
var filepath = &#39;/tmp/demo/js/test.js&#39;;

// 输出:/tmp/demo/js
console.log( path.dirname(filepath) );

取得檔案名稱

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

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

var path = require(&#39;path&#39;);

// 输出:test.js
console.log( path.basename(&#39;/tmp/demo/js/test.js&#39;) );

// 输出:test
console.log( path.basename(&#39;/tmp/demo/js/test/&#39;) );

// 输出:test
console.log( path.basename(&#39;/tmp/demo/js/test&#39;) );

如果只想取得檔案名,單一不包含檔案擴充呢?可以用上第二個參數。

// 输出:test
console.log( path.basename(&#39;/tmp/demo/js/test.js&#39;, &#39;.js&#39;) );

取得檔案副檔名

簡單的範例如下:

var path = require(&#39;path&#39;);
var filepath = &#39;/tmp/demo/js/test.js&#39;;

// 输出:.js
console.log( path.extname(filepath) );

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

     從B的最後一個.開始截取,直到最後一個字元。

    如果B中不存在.,或B的第一個字元就是.,那麼回傳空字串。

直接看官方文件的範例

path.extname(&#39;index.html&#39;)
// returns &#39;.html&#39;

path.extname(&#39;index.coffee.md&#39;)
// returns &#39;.md&#39;

path.extname(&#39;index.&#39;)
// returns &#39;.&#39;

path.extname(&#39;index&#39;)
// returns &#39;&#39;

path.extname(&#39;.index&#39;)
// returns &#39;&#39;

路徑組合

##
path.join([...paths])
path.resolve([...paths])

path.join([...paths])

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

範例如下:

var path = require(&#39;path&#39;);

// 输出 &#39;/foo/bar/baz/asdf&#39;
path.join(&#39;/foo&#39;, &#39;bar&#39;, &#39;baz/asdf&#39;, &#39;quux&#39;, &#39;..&#39;);

path定義的偽代碼如下:

module.exports.join = function(){
 var paths = Array.prototye.slice.call(arguments, 0);
 return this.normalize( paths.join(&#39;/&#39;) );
};


path.resolve([...paths])

#這個介面的說明有點囉嗦。你可以想像現在你在shell下面,從左到右執行一遍cd path指令,最後取得的絕對路徑/檔名,就是這個介面所回傳的結果了。 例如

path.resolve('/foo/bar', './baz')

可以看成下面指令的結果

cd /foo/bar
cd ./baz

#更多對比範例如下:

var path = require(&#39;path&#39;);

// 假设当前工作路径是 /Users/a/Documents/git-code/nodejs-learning-guide/examples/2016.11.08-node-path

// 输出 /Users/a/Documents/git-code/nodejs-learning-guide/examples/2016.11.08-node-path
console.log( path.resolve(&#39;&#39;) )

// 输出 /Users/a/Documents/git-code/nodejs-learning-guide/examples/2016.11.08-node-path
console.log( path.resolve(&#39;.&#39;) )

// 输出 /foo/bar/baz
console.log( path.resolve(&#39;/foo/bar&#39;, &#39;./baz&#39;) );

// 输出 /foo/bar/baz
console.log( path.resolve(&#39;/foo/bar&#39;, &#39;./baz/&#39;) );

// 输出 /tmp/file
console.log( path.resolve(&#39;/foo/bar&#39;, &#39;/tmp/file/&#39;) );

// 输出 /Users/a/Documents/git-code/nodejs-learning-guide/examples/2016.11.08-node-path/www/js/mod.js
console.log( path.resolve(&#39;www&#39;, &#39;js/upload&#39;, &#39;../mod.js&#39;) );

#路徑解析

path.parse(path)

path.normalize(filepath)

##從官方文件的描述來看,path.normalize(filepath)

應該是比較簡單的一個API,不過用起來總是覺得沒底。

為什麼呢? API說明太簡單了,包括如下:


      如果路徑為空,返回.,相當於目前的工作路徑。


      將路徑中重複的路徑分隔符號(例如linux下的/)合併為一。


      路徑中的.、..處理。 (類似shell裡的cd ..)


      若路徑最後有/,則保留該/。

感覺stackoverflow上一個兄弟對這個API的解釋比較實在,原文連結。

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"

程式碼範例如下。建議讀者把程式碼拷貝出來運行下,看下實際效果。

var path = require(&#39;path&#39;);
var filepath = &#39;/tmp/demo/js/test.js&#39;;

var index = 0;

var compare = function(desc, callback){
 console.log(&#39;[用例%d]:%s&#39;, ++index, desc);
 callback();
 console.log(&#39;\n&#39;);
};

compare(&#39;路径为空&#39;, function(){
 // 输出 .
 console.log( path.normalize(&#39;&#39;) );
});

compare(&#39;路径结尾是否带/&#39;, function(){
 // 输出 /tmp/demo/js/upload
 console.log( path.normalize(&#39;/tmp/demo/js/upload&#39;) );

 // /tmp/demo/js/upload/
 console.log( path.normalize(&#39;/tmp/demo/js/upload/&#39;) );
});

compare(&#39;重复的/&#39;, function(){
 // 输出 /tmp/demo/js
 console.log( path.normalize(&#39;/tmp/demo//js&#39;) );
});

compare(&#39;路径带..&#39;, function(){
 // 输出 /tmp/demo/js
 console.log( path.normalize(&#39;/tmp/demo/js/upload/..&#39;) );
});

compare(&#39;相对路径&#39;, function(){
 // 输出 demo/js/upload/
 console.log( path.normalize(&#39;./demo/js/upload/&#39;) );

 // 输出 demo/js/upload/
 console.log( path.normalize(&#39;demo/js/upload/&#39;) );
});

compare(&#39;不常用边界&#39;, function(){
 // 输出 ..
 console.log( path.normalize(&#39;./..&#39;) );

 // 输出 ..
 console.log( path.normalize(&#39;..&#39;) );

 // 输出 ../
 console.log( path.normalize(&#39;../&#39;) );

 // 输出 /
 console.log( path.normalize(&#39;/../&#39;) );
 
 // 输出 /
 console.log( path.normalize(&#39;/..&#39;) );
});

檔案路徑分解/組合

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

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

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

首先是linux下

###
┌─────────────────────┬────────────┐
│   dir  │ base │
├──────┬    ├──────┬─────┤
│ root │    │ name │ ext │
" / home/user/dir / file .txt "
└──────┴──────────────┴──────┴─────┘
(all spaces in the "" line should be ignored -- they are purely for formatting)

然后是windows下

┌─────────────────────┬────────────┐
│   dir  │ base │
├──────┬    ├──────┬─────┤
│ root │    │ name │ ext │
" C:\  path\dir \ file .txt "
└──────┴──────────────┴──────┴─────┘
(all spaces in the "" line should be ignored -- they are purely for formatting)

path.format(pathObject)

阅读相关API文档说明后发现,path.format(pathObject)中,pathObject的配置属性是可以进一步精简的。

根据接口的描述来看,以下两者是等价的。

     root vs dir:两者可以互相替换,区别在于,路径拼接时,root后不会自动加/,而dir会。

     base vs name+ext:两者可以互相替换。

var path = require(&#39;path&#39;);

var p1 = path.format({
 root: &#39;/tmp/&#39;, 
 base: &#39;hello.js&#39;
});
console.log( p1 ); // 输出 /tmp/hello.js

var p2 = path.format({
 dir: &#39;/tmp&#39;, 
 name: &#39;hello&#39;,
 ext: &#39;.js&#39;
});
console.log( p2 ); // 输出 /tmp/hello.js

path.parse(filepath)

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

四个属性,对于使用者是挺便利的,不过path.format(pathObject) 中也是四个配置属性,就有点容易搞混。

path.parse(&#39;/home/user/dir/file.txt&#39;)
// returns
// {
// root : "/",
// dir : "/home/user/dir",
// base : "file.txt",
// ext : ".txt",
// name : "file"
// }

获取相对路径

接口:path.relative(from, to)

描述:从from路径,到to路径的相对路径。

边界:

     如果from、to指向同个路径,那么,返回空字符串。

     如果from、to中任一者为空,那么,返回当前工作路径。

上例子:

var path = require(&#39;path&#39;);

var p1 = path.relative(&#39;/data/orandea/test/aaa&#39;, &#39;/data/orandea/impl/bbb&#39;);
console.log(p1); // 输出 "../../impl/bbb"

var p2 = path.relative(&#39;/data/demo&#39;, &#39;/data/demo&#39;);
console.log(p2); // 输出 ""

var p3 = path.relative(&#39;/data/demo&#39;, &#39;&#39;);
console.log(p3); // 输出 "../../Users/a/Documents/git-code/nodejs-learning-guide/examples/2016.11.08-node-path"

平台相关接口/属性

以下属性、接口,都跟平台的具体实现相关。也就是说,同样的属性、接口,在不同平台上的表现不同。

    path.posix:path相关属性、接口的linux实现。

    path.win32:path相关属性、接口的win32实现。

    path.sep:路径分隔符。在linux上是/,在windows上是``。

    path.delimiter:path设置的分割符。linux上是:,windows上是;。

注意,当使用 path.win32 相关接口时,参数同样可以使用/做分隔符,但接口返回值的分割符只会是``。

直接来例子更直观。

> path.win32.join(&#39;/tmp&#39;, &#39;fuck&#39;)
&#39;\\tmp\\fuck&#39;
> path.win32.sep
&#39;\\&#39;
> path.win32.join(&#39;\tmp&#39;, &#39;demo&#39;)
&#39;\\tmp\\demo&#39;
> path.win32.join(&#39;/tmp&#39;, &#39;demo&#39;)
&#39;\\tmp\\demo&#39;

path.delimiter

linux系统例子:

console.log(process.env.PATH)
// &#39;/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin&#39;

process.env.PATH.split(path.delimiter)
// returns [&#39;/usr/bin&#39;, &#39;/bin&#39;, &#39;/usr/sbin&#39;, &#39;/sbin&#39;, &#39;/usr/local/bin&#39;]

windows系统例子:

console.log(process.env.PATH)
// &#39;C:\Windows\system32;C:\Windows;C:\Program Files\node\&#39;

process.env.PATH.split(path.delimiter)
// returns [&#39;C:\\Windows\\system32&#39;, &#39;C:\\Windows&#39;, &#39;C:\\Program Files\\node\\&#39;]

以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!

相关推荐:

关于Vuex管理登录的状态解析

关于vue解决跨域路由冲突问题的思路

以上是Node.js中路徑處理模組path的介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn