1. 概念
__dirname
可以用来动态获取当前文件所属目录的绝对路径__filename
可以用来动态获取当前文件的绝对路径,包含当前文件__dirname
和__filename
是不受执行node命令所属路径影响的
2. 代码演示
目录结构
app.js文件,使用node app.js
命令执行app.js文件
console.log(__dirname); //D:\code\frontend\nodeProject\test
console.log(__filename); //D:\code\frontend\nodeProject\test\app.js
foo文件夹下的 a.txt 文件中只有一个字符串hello aaa
foo文件夹下的 index.js 文件:
let fs = require('fs');
let path = require('path');
//读取 a.txt 文件,注意此处使用的是相对路径 './a.txt'
fs.readFile('./a.txt','utf-8',function (err,data) {
if (err) {
throw err
}
console.log(data);
})
2.1 测试
- 如果我们通过终端在 foo 文件目录中执行 foo 文件夹下的 index.js 文件,那么上边的代码是没有任何问题的。
- 但是,如果我们在 test 目录下通过
node foo/index.js
命令执行 foo 文件夹下的 index.js 文件,上边的代码就会报错。
报错信息显示在test文件夹下找不到 a.txt 文件。
2.2 背后原因
当我们进行文件操作,使用相对路径时,此处的“相对”指的是相对于执行node命令所在的路径。
也就是说上边的代码,当我们在 test 目录下使用 node 命令去执行 foo 文件夹下的 index.js 文件(我们在该文件中使用了相对路径
./a.txt
), 那么就会去 test 目录下寻找 a.txt 文件,而不是去 foo 目录中寻找。
- 注意:这不是错误,Node就是这样设计的,文件操作中,相对路径设计的就是相对于执行node命令所处的路径
- 所以文件操作中,使用相对路径是不可靠的
- 为了解决这个问题,只需要把相对路径变为 动态的绝对路径,
__dirname
此时就派上了用场
2.3 改进代码
let fs = require('fs');
let path = require('path');//引入path模块
//使用 path 的 join 方法将两个路径拼接起来
fs.readFile(path.join(__dirname,'./a.txt'),'utf-8',function (err,data) {
if (err) {
throw err
}
console.log(data);
})
此时不管我们在那个目录下执行index.js,它都可以正常运行。
注意: 当我们导入自己编写的模块时,使用了相对路径,那么该相对于谁就相对于谁,这里的路径标识和文件操作过程中的路径没有关系。