1. __dirname和__filename的作用
__dirname
和__filename
是node中提供的两个动态的变量,可以动态的获取绝对路径,一般和fs模块配合使用
__dirname
作用:返回文件模块所在的绝对路径,不包含文件
PS E:\good good study\NodeJs\dirname> node .\app.js
E:\good good study\NodeJs\dirname\foo
__filename
作用:返回文件模块的绝对路径,包含文件
PS E:\good good study\NodeJs\dirname> node .\app.js
E:\good good study\NodeJs\dirname\foo\index.js
2. __dirname和__filename的使用场景
-
首先,先看一个应用场景,定义一个项目
image.png -
其中,各个文件中的内容如下
- a.txt文件
hello world
- index.js文件
const fs = require('fs'); fs.readFile('./a.txt', 'utf8', function(err, data) { if(err) { throw err; } console.log(data) })
- app.js文件
let index = require('./foo/index')
然后,在命令行运行index.js文件
PS E:\good good study\NodeJs\dirname\foo> node .\index.js
hello world
注意:这里没有问题,正常读取到了
a.txt
中的内容,这里执行node的路径是E:\good good study\NodeJs\dirname\foo
- 接着,我们把路径退回一层,继续执行index.js
PS E:\good good study\NodeJs\dirname\foo> node .\index.js
hello world
PS E:\good good study\NodeJs\dirname\foo> cd ..
PS E:\good good study\NodeJs\dirname> node .\foo\index.js
E:\good good study\NodeJs\dirname\foo\index.js:4
throw err;
^
Error: ENOENT: no such file or directory, open 'E:\good good study\NodeJs\dirname\a.txt'
PS E:\good good study\NodeJs\dirname>
注意:很重要的一点,node中的文件模块的读文件操作中的相对路径,是相对于执行node命令时的路径来说的,而不是相对于自身的文件来说的,所以这里会报错,他会去
E:\good good study\NodeJs\dirname\a.txt
这个路径下找a.txt
文件。
- 当然,实际开发中不会这么用,但是我们可能会以app.js来启动服务
PS E:\good good study\NodeJs\dirname> node .\app.js
E:\good good study\NodeJs\dirname\foo\index.js:4
throw err;
^
Error: ENOENT: no such file or directory, open 'E:\good good study\NodeJs\dirname\a.txt'
PS E:\good good study\NodeJs\dirname>
道理是一样的,我们启动node的时候的路径是
E:\good good study\NodeJs\dirname
,所以它就会在dirname文件夹
下面找a.txt
,当然是找不到的,所以报错。
所以我们在读文件操作的时候,路径最好写成绝对路径,这时就需要__dirname
或者__filename
了。
改写一下index.js文件
const fs = require('fs');
const path = require('path');
fs.readFile(path.join(__dirname, 'a.txt'), 'utf8', function(err, data) {
if(err) {
throw err;
}
console.log(data)
})
命令行启动
PS E:\good good study\NodeJs\dirname\foo> cd ..
PS E:\good good study\NodeJs\dirname> node .\foo\index.js
hello world
PS E:\good good study\NodeJs\dirname> node .\app.js
hello world
PS E:\good good study\NodeJs\dirname>
这样问题就解决了,总结,在模块中进行读文件操作的时候要
fs
和path
模块配合来使用,这样就可以避免文件相对路径出错的问题。