Node 中的文件路径大概有 __dirname,__filename, process.cwd(), ./ 或者 ../,前三个都是绝对路径,为了便于比较,./ 和 ../ 我们通过 path.resolve('./')来转换为绝对路径,path.join()也可以转换为绝对路径。
path.resolve():返回一个绝对路径(不包括文件名),从右向左拼接字符串,当遇到“/”停止拼接,如果遇到'./'或者'../'则按照其原来的意思进行转换。
path.join():基本上同path.resolve()
一些结论
1)__dirname : 总是返回被执行的 js 所在 文件夹的绝对路径2)__filename:总是返回被执行的 js 文件 的绝对路径
3)process.cwd(): 总是返回运行 node 命令时所在的文件夹的绝对路径
4)./:在 require() 中使用是跟 __dirname 的效果相同,不会因为启动脚本的目录不一样而改变,在其他情况下跟 process.cwd() 效果相同,是相对于启动脚本所在目录的路径
只有在 require() 时才使用相对路径(./表示当前目录下, ../表示上一级目录下) 的写法,其他地方一律使用绝对路径,如下:
// 当前目录下
path.dirname(__filename) + '/test.js'; //path.dirname()不包含文件名的绝对路径
// 相邻目录下
path.resolve(__dirname, '../lib/common.js'); //相对路径
例如:在Users文件夹下有如下目录结构:
app/
-lib/
-common.js
-model
-task.js
-test.js
1) 在task.js文件下编写如下内容:
var path = require('path');
console.log(__dirname);
console.log(__filename);
console.log(process.cwd());
console.log(path.resolve('./'));
在model目录下运行node task.js得到的输出是:
/Users/app/model
/Users/app/model/task.js
/Users/app/model
/Users/app/model
2) 还是上面的结构,将task.js文件里面的内容改成下面
var fs = require('fs');
var common = require('../lib/common');
fs.readFile('../lib/common.js', function (err, data) {
if (err) return console.log(err);
console.log(data);
});
在model目录下运行一切ok,在app目录下运行node model/task.js下报错,这是因为在app下运行,../lib/common.js会转换成/Users/app/lib/common.js
以下对node.js中的path模块的相关API做介绍
1、获取路径/文件名/扩展名
1)获取绝对路径(不包括文件名):path.dirname(filepath)
2)获取文件名:path.basename(filepath)
3)获取文件扩展名:path.extname(filepath)
2、路径组合
1)path.join([...paths]):
2)path.resolve([...paths])
3、文件路径分解/组合
1)path.parse(filepath):
2)path.format(pathObject):将pathObject的root、dir、base、name、ext属性,按照一定的规则,组合成一个文件路径
4、获取相对路径
1)path.relative(from,to)
5、平台相关接口/属性
1)path.posix:path相关属性、接口的linux实现
2)path.win32:path相关属性、接口的win32实现
3)path.sep:路径分隔符。在linux上是/,在windows上是\
4)path.delimiter:path设置的分割符。linux上是:,windows上是;
详细讲解的链接:点击打开链接