前言: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.txt
和a.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
可以有三种写法。
选谁不用多讲了吧——当然是全都要。