NodeJs 的 path 模块

前言:NodeJs 的 path 模块的作用就是用来处理文件路径的。简单介绍下几个常用的 API。

一、path.basename

获取带后缀的文件名:

const path = require("path");

console.log(path.basename("a/index.js"));//index.js

获取不带后缀的文件名:

const path = require("path");

console.log(path.basename("a/index.js",".js"));//index

如果第二个参数.js和第一个参数文件名后缀不同的话,第二个参数忽略不计,也就是不起作用。

二、path.dirname

获取路径名:

const path = require("path");

console.log(path.dirname("E:/node/a/index.js"));//E:/node/a
三、path.extname

获取文件的后缀名:

const path = require("path");

console.log(path.extname("E:/node/a/index.js"));//.js
三、path.isAbsolute

判断路径是否是绝对路径:

const path = require("path");

console.log(path.isAbsolute("E:/node/a/index.js"));//true
console.log(path.isAbsolute("/node/index.js"));//true
console.log(path.isAbsolute("node/index.js"));//false
console.log(path.isAbsolute("../node/index.js"));//false
四、path.parse

把一个目录解析成对象的格式:

const path = require("path");

console.log(path.parse("E:/node/a/index.js")); 
// {
//     root: 'E:/',
//     dir: 'E:/node/a',
//     base: 'index.js',
//     ext: '.js',
//     name: 'index'
// }
五、path.join

路径拼接:

const path = require("path");

console.log(path.join("a","b","c"));//a\b\c

这个特别的有用,主要是解决我们写程序的时候路径拼接可能出错的情况。比如我们写程序的时候使用+连接路径过长可能出错。

其中还需要注意不同的操作系统路径分隔符是不同的比如:windows里的路径是:\,但在苹果系统和Linux系统中就是:/

所以在 windows 系统里面调试的话,发现有两个 \\因为 反斜杠有转义的作用所以\\=\

六、path.resolve

得到一个或几个路径的绝对路径:

const path = require("path");

console.log(path.resolve("a","b","c"));//C:\Users\Administrator\Desktop\node_mysql\代码\wechat\a\b\c

如果我们退出一层执行程序:


resolve 解析的绝对路径是以终端目录为准的绝对路径。
文件路径使用绝对路径,/会以右边第一个路径开始为起始点开始生成绝对路径:

七、filename 和 dirname

filename 和 dirname可以直接使用不需要模块引入:

  • filename 动态获取当前文件目录的绝对路径
  • dirname 动态获取当前文件夹的绝对路径
console.log(__dirname);
console.log(__filename);
《=============》
C:\Users\Administrator\Desktop\node_mysql\代码\wechat>node test.js
C:\Users\Administrator\Desktop\node_mysql\代码\wechat
C:\Users\Administrator\Desktop\node_mysql\代码\wechat\test.js

NodeJs 里面的相对路径是不可信的,因为相对路径相对的目录就是执行 node 命令的终端的目录,不是相对文件所在的目录。

为什么讲相对路径在 NodeJs 里面是不可靠的,我们尝试使用相对路径来读取一个文件:

const { readFile } = require("fs");

readFile("./a.txt",(err,res)=>{
    if(err) return;
    console.log(res);
});

直接运行这个文件打印出来的读取结果是 buffer 格式,为了能够显示中文,可以对读取结果res.toString()。不过最好还是指定文件读取字符编码比较好:

const { readFile } = require("fs");

readFile("./a.txt","utf8",(err,res)=>{
    if(err) return;
    console.log(res);
});

我们在CMD窗口来运行这个程序:

C:\Users\Administrator\Desktop\node_mysql\代码\wechat>node test.js
hello!我是a.txt文件

readFile 读取文件的相对路径是相对 node 执行命令的终端目录即:C:\Users\Administrator\Desktop\node_mysql\代码\wechat,在这个目录下去找 a.txt,恰好能够找到,如果这时我们退出一层执行代码的话,相对路径就会出现问题。

C:\Users\Administrator\Desktop\node_mysql\代码>node ./wechat/test.js

readFile 会在终端执行目录C:\Users\Administrator\Desktop\node_mysql\代码寻找 a.txt 很明显找不到,文件读取错误,什么也不输出。所以我们写代码为了能保证文件路径永远正确都是动态获取文件的绝对路径:

const { readFile } = require("fs");
readFile(__dirname + "./a.txt","utf8",(err,res)=>{
    if(err)return;
    console.log(res);
});

你写了发现没用,执行程序没打印出来结果,原因就是路径拼接错误:console.log(__dirname+"./a.txt");


多了个点。。。改写下:

const { readFile } = require("fs");
const { resolve } = require("path");
readFile(__dirname + "/a.txt","utf8",(err,res)=>{
    if(err)return;
    console.log(res);
});

看来还是太相信自己了,拼接路径还是比较容易出错的path.join() 可以上场了,path.join()就是为了拼接路径的,可以让开发者无脑写路径,其他用一点没有:

const { readFile } = require("fs");
const { join } = require("path");
readFile(join(__dirname,"./a.txt"),"utf8",(err,res)=>{
    if(err)return;
    console.log(res);
});

其中第二个参数我们可以写./a.txt/a.txta.txt这三种写法,这时候你就可以去他ma的格式了。其中这里也可以把 join 改成 resolve,但改成 resolve 的话第二个参数就必须严格只能写个文件名,resolve 也就只有这一种写法。

const { readFile } = require("fs");
const { resolve } = require("path");
readFile(resolve(__dirname,"a.txt"),"utf8",(err,res)=>{//不能加/或./但是../可以使用
    if(err)return;
    console.log(res);
});

测试:假设 a 文件夹和 b 文件夹是同级文件,现在 a 文件夹里面有个 a.js , a.js 需要读取 b 文件夹里面的 b.txt 文件的内容,请问在 a.js 里面如何写这个绝对路径。
答:path.join(__dirname,"../b","b.txt");(其中一种)

八、总结

NodeJs 里面凡是用到读取本地文件的,都必须使用绝对路径__dirname进行字符串拼接(相对路径不可靠),但因为绝对路径在拼写的时候可能拼写错误,最好使用 path.join(__dirname,"XXX.XXX"); 进行路径名拼接,当然也可以使用 path.resolve(__dirname,"XXX.XXX")来代替,但是与path.join 相比同一路径 resolve 只能有一种写法,而 join 可以有三种写法。

选谁不用多讲了吧——当然是全都要。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,843评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,538评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,187评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,264评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,289评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,231评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,116评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,945评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,367评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,581评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,754评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,458评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,068评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,692评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,842评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,797评论 2 369
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,654评论 2 354

推荐阅读更多精彩内容