在Node.js中常用的文件路径有如下几种情况:
__dirname
:返回被执行的js所在文件夹的绝对路径。__filename
:返回被执行的js的绝对路径。process.cwd()
:返回运行node命令所在文件夹的绝对路径。./
:表示相对路径,是当前被执行的js所在文件夹的路径。../
:表示相对路径,是当前被执行的js所在文件夹的父目录的路径。
例如,有如下文件:
其中node.js代码如下:
var path=require('path');
console.log(__dirname);
console.log(__filename);
console.log(process.cwd());
console.log(path.resolve('./'));// path.resolve()可以将相对路径转换成绝对路径
console.log(path.resolve('../'));
然后在demo目录下执行node test.js
命令启动程序,打印的结果如下:
可以看到结果确实如上所述。
然后跳到上一级目录node-demo下,执行node demo/test.js
命令,发现__dirname
、__filename
的结果仍然一样,因为__dirname
和__filename
跟js文件的所在路径有关,跟执行node
命令所在路径无关。可用于fs
模块读取文件内容和向文件写入内容,使用__dirname
和__filename
来获取绝对路径比较好,即使迁移代码后也不需要修改。
而process.cwd()
跟node
命令执行的所在路径相关,如在D:\NodeJs
目录下执行该node
命令,那么process.cwd()
打印的就是D:\NodeJs
,与js文件的所在路径无关。可用于命令行,如用commander.js
写了一个命令行工具就可以获取执行的命令所在路径如/root/home
或/root
或/usr/local/
,可以拿到这个路径做一些操作,比如获取该路径下的所有文件列表。
而./
和../
应该只在require()
导入模块的时候使用,其他情况都使用绝对路径。因为在require()
中使用./
的效果跟__dirname
一样,跟js文件的所在路径有关;但在其他情况下则效果与process.cwd()
一样,跟执行的node
命令所在路径有关。如下代码可以证明:
var path = require('path');
var fs = require('fs');
fs.readFile('./hello.txt', function (err, data) {
if (!err) {
console.log(data.toString());
}else {
console.log(err);
}
});
发现在node-demo目录下找不到hello.txt文件,证明./
如果是在非require()
中使用,那么效果跟process.cwd()
一样。
结论:仅在require()
中使用相对路径./
和../
;在其他情况下都使用绝对路径__dirname
和__filename
;如果需要获取node
命令执行的所在路径则使用process.cwd()
。
参考:
- 浅析 NodeJs 的几种文件路径