本文同步自我的個人博客:http://www./2015/12/04/learn-node-path.html
path 模塊是 node 用于整理、轉(zhuǎn)換、合并路徑的神器,只要是路徑問題,都可以交給它處理。
但它僅僅是處理路徑字符串,而不會去堅持或處理文件。
path.normalize 路徑整理
做項目時,往往都是基于相對路徑,于是經(jīng)常會出現(xiàn)類似這樣的路徑 path//upload/../file/./123.jpg。
當然這個是把所有坑都寫到一起了,不過就算這樣的路徑,path.normalize 分分鐘搞定。
var path = require('path');
var str = path.normalize('./path//upload/data/../file/./123.jpg');
console.log(str); // path/upload/file/123.jpg
path.join 拼接路徑
那些奇葩路徑往往都是自己拼接導(dǎo)致的,如果用一些工具幫助我們處理這,就可以直接得到規(guī)范的路徑了,而且不需要擔心跨平臺問題。這里的 path.join 就可以幫助我們生產(chǎn)跨平臺,規(guī)范化的路徑字符串。
var path = require('path');
var str = path.join('./path/./', './upload', '/file', '123.jpg');
console.log(str); // path/upload/file/123.jpg
var str = path.join('path', 'upload', 'file', '123.jpg');
console.log(str); // path/upload/file/123.jpg
var arr = ['path', 'upload', 'file', '123.jpg'];
var str = path.join.apply(null, arr);
console.log(str); // path/upload/file/123.jpg
這個方法雖然方便,但是參數(shù)只能是字符串,否則會拋出錯誤(0.10以上版本)。
path.resolve 絕對路徑
這個絕對路徑操作,跟上面的不太一樣,如果你懂命令行 cd 命令,那就秒懂了,否則需要花點時間多跑幾個例子才能理解。這次直接上官方例子。
path.resolve('foo/bar', '/tmp/file/', '..', 'a/../subfile');
// 返回 /tmp/subfile
相當于命令行下的
cd foo/bar
cd /tmp/file/
cd ..
cd a/../subfile
pwd
他的解析不是在是簡單的拼接關(guān)系,而是類似 cd 命令的解析了。
path.relative 相對路徑
有絕對就有相對,有時我們有兩個絕對路徑, 我們需要從中找出相對目錄的起源目錄。
path.relative('/data/orandea/test/aaa', '/data/orandea/impl/bbb')
// 返回 ../../impl/bbb
path.dirname 文件路徑
根據(jù)一個文件或目錄得到它所在的目錄路徑,這個很常用。
var path = require('path');
var str = path.dirname('path/upload/file/123.jpg');
console.log(str); // path/upload/file
var str = path.dirname(__filename); // 等價于 __dirname
console.log(str, __dirname); // 當前文件所在目錄
path.basename 獲取路徑中的文件名
確切的說是返回最后一個路徑分割后面的文件名,不論是文件還是目錄,第二個參數(shù)可以忽略文件后綴。
var path = require('path');
var str = path.basename('path/upload/file/123.txt.jpg');
console.log(str); // 123.txt.jpg
var str = path.basename('path/upload/file/123.txt.jpg', '.jpg');
console.log(str); // 123.txt
var str = path.basename('path/upload/file/123.txt.jpg', '.txt.jpg');
console.log(str); // 123
var str = path.basename('path/upload/file/');
console.log(str); // file
代碼都是簡單易懂的。
path.extname 文件后綴
確切說,就是返回最后一個 . 之后的字符串,沒有則返回空。
var path = require('path');
var str = path.extname('path/upload/file/123.txt.jpg');
console.log(str); // '.jpg'
var str = path.extname('path/upload/file/123.txt');
console.log(str); // '.txt'
var str = path.extname('path/upload/file/');
console.log(str); // ''
path.parse 解析路徑
把一個路徑解析為一個 {root:'', dir:'', base:'', ext:'', name:''} 這樣的對象。
有時候要獲取文件名,文件后綴,文件目錄,這樣到省事了,直接搞定。上官方例子。
path.parse('/home/user/dir/file.txt')
// returns
{
root : "/",
dir : "/home/user/dir",
base : "file.txt",
ext : ".txt",
name : "file"
}
// windows
path.parse('C:\\path\\dir\\index.html')
// returns
{
root : "C:\\",
dir : "C:\\path\\dir",
base : "index.html",
ext : ".html",
name : "index"
}
path.format 生成路徑
正好跟 path.parse 相反,這個則是根據(jù) {root:'', dir:'', base:'', ext:'', name:''} 這樣的對象來生成字符串。上官方例子。
path.format({
root : "/",
dir : "/home/user/dir",
base : "file.txt",
ext : ".txt",
name : "file"
})
// returns
'/home/user/dir/file.txt'
其他屬性
還有一些屬性,如 path.sep 不同平臺下的文件路徑分隔符,win 是 \\,*nix 則是 /。
path.delimiter 字面解釋,這才是分隔符,但這個往往是環(huán)境變量中出現(xiàn)的,win 是 ;,*nix 則是 :,你們懂的。
還有兩個奇葩屬性,path.posix 和 path.win32 他們都包含上面這些方法屬性,前者跨平臺,后者只是win上。
不知道為什么要單獨搞兩個這樣的屬性。
好了,爭取每天學(xué)習(xí)一點基礎(chǔ),只有把這些基礎(chǔ)知識梳理一遍,才能更好的掌握 node。
|