抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

摘要:本文主要学习了如何在编写代码时规范使用路径。

环境

Windows 10 企业版 LTSC 21H2
Node 18.14.0
NVM 1.1.12

1 概念

在处理路径时,涉及到两个概念:

  • 相对路径:以当前工作目录为起点的路径,表示从当前目录到目标文件或目录的相对位置。示例:
  1. 使用./file.txt表示当前目录下的file.txt文件,也可以使用file.txt表示,可以省略前面的./符号。
  2. 使用../file.txt表示当前目录的上级目录下的file.txt文件,不能省略前面的../符号。
  • 绝对路径:从根目录开始的完整路径,表示从根目录到目标文件或目录的确切位置。示例:
  1. 在Windows系统中,使用D:\file.txt表示D盘根目录下的file.txt文件。
  2. 在Linux系统中,使用/file.txt表示根目录下的file.txt文件。

不同操作系统在管理路径存在差异:

  • 在Linux系统中,使用/表示根目录,将/作为目录的间隔符号。
  • 在Windows系统中,使用D:\表示D盘根目录,将\作为目录的间隔符号。但是在一些编程语言里兼容了Linux系统的规则,支持使用/表示当前盘的根目录,支持将/作为目录的间隔符号。

2 问题

在涉及路径的开发过程中,如果使用相对路径,会导致相同的代码在不同路径执行得到结果不一致。

创建file目录作为当前目录,在当前目录创建file.js文件和file.txt文件,在file.js文件编写代码:

file.js
1
2
3
const fs = require('fs');
let data = fs.statSync('./file.txt');
console.log(data);

在当前目录执行命令node file.js成功,因为当前目录存在file.txt文件,在上级目录执行node file/file.js失败,因为上级目录没有file.txt文件。

为了解决这个问题,建议使用绝对路径,保证代码执行的结果和预期一致:

  • 使用__filename变量可以获得代码文件绝对路径。
  • 使用__dirname变量可以获得代码文件所在目录的绝对路径。

修改当前目录的file.js文件,使用__dirname变量拼接file.txt文件的绝对路径:

file.js
1
2
3
4
5
6
7
const fs = require('fs');
console.log(__filename);// D:\momashanhe\file\file.js
console.log(__dirname);// D:\momashanhe\file
let path = __dirname + '/file.txt';
console.log(path);// D:\momashanhe\file/file.txt
let data = fs.statSync(path);
console.log(data);

无论是在当前目录还是在上级目录执行,都会在file.js文件所在的目录查找file.txt文件。

在拼接时建议使用/作为分隔符,不能使用\作为分隔符,因为\单独使用表示转义字符,需要使用转义后的\\表示\作为分隔符:

file.js
1
2
3
4
5
const fs = require('fs');
let path = __dirname + '\\file.txt';
console.log(path);// D:\momashanhe\file\file.txt
let data = fs.statSync(path);
console.log(data);

3 使用

Node中内置的path模块简化了对路径的操作。

3.1 拼接路径

语法:

js
1
path.resolve([...paths])

返回:

  • String对象。

参数:

  • paths:文件路径,支持多个拼接。如果参数是绝对路径,则清空前面的参数,拼接后面的参数。

示例:

js
1
2
3
4
const path = require('path');
console.log(path.resolve(__dirname, 'file.txt'));// D:\momashanhe\file\file.txt
console.log(path.resolve('/momashanhe', 'file', 'file.txt'));// D:\momashanhe\file\file.txt
console.log(path.resolve('/momashanhe', '/file', 'file.txt'));// D:\file\file.txt

3.2 获取分隔符

语法:

js
1
path.sep

返回:

  • String对象。

示例:

js
1
2
const path = require('path');
console.log(path.sep);// \

3.3 解析路径

语法:

js
1
2
3
path.basename(path[, suffix])// 获取路径基础名称
path.dirname(path)// 获取路径目录名称
path.extname(path)// 获取路径扩展名称

返回:

  • String对象。

参数:

  • path:文件路径。
  • suffix:要删除的可选后缀。

示例:

js
1
2
3
4
const path = require('path');
console.log(path.basename('D:\\momashanhe\\file\\file.txt'));// file.txt
console.log(path.dirname('D:\\momashanhe\\file\\file.txt'));// D:\momashanhe\file
console.log(path.extname('D:\\momashanhe\\file\\file.txt'));// .txt

3.4 解析路径返回对象

语法:

js
1
path.parse(path)

返回:

  • Object对象,封装了对象信息。

参数:

  • path:文件路径。

示例:

js
1
2
3
4
5
6
7
8
9
const path = require('path');
console.log(path.parse('D:\\momashanhe\\file\\file.txt'));
// {
// root: 'D:\\',
// dir: 'D:\\momashanhe\\file',
// base: 'file.txt',
// ext: '.txt',
// name: 'file'
// }

3.5 解析对象返回路径

语法:

js
1
path.format(pathObject)

返回:

  • String对象。

参数:

  • pathObject:文件对象。

示例:

js
1
2
3
4
5
6
const path = require('path');
console.log(path.format({
dir: 'D:\\momashanhe\\file',
base: 'file.txt',
}));
// D:\momashanhe\file\file.txt

评论