path-文件路径处理

path是NodeJS中用于处理文件路径的核心模块,它提供了一系列实用的工具函数来操作文件路径字符串。在跨平台开发中,path模块尤为重要,因为不同操作系统的路径分隔符不同(Windows使用\,而Linux使用/),使用path模块可以帮助我们编写出兼容各平台的代码。

导入模块

在ESM模块机制下,我们可以通过以下方式导入path模块。

import path from "node:path";

路径拼接

path.join()

path.join()用于将多个路径片段拼接成一个完整的路径,它会自动处理路径分隔符和...等相对路径符号。

import path from "node:path";

// 基本拼接
const p1 = path.join("/home", "user", "documents");
console.log(p1); // /home/user/documents

// 处理相对路径
const p2 = path.join("/home", "user", "..", "admin");
console.log(p2); // /home/admin

// 处理多余的斜杠
const p3 = path.join("/home/", "/user/", "/file.txt");
console.log(p3); // /home/user/file.txt

path.resolve()

path.resolve()用于将路径片段解析为绝对路径,它从右向左依次处理路径片段,直到构造出一个绝对路径。如果处理完所有片段后仍未得到绝对路径,则会使用当前工作目录。

import path from "node:path";

// 解析为绝对路径
const p1 = path.resolve("src", "index.js");
console.log(p1); // /当前工作目录/src/index.js

// 遇到绝对路径会重新开始
const p2 = path.resolve("/home", "user", "/admin", "file.txt");
console.log(p2); // /admin/file.txt

// 结合__dirname使用
import { fileURLToPath } from "node:url";
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);

const p3 = path.resolve(__dirname, "config", "app.json");
console.log(p3); // /当前文件所在目录/config/app.json

路径解析

path.parse()

path.parse()用于将路径字符串解析为一个包含各部分信息的对象。

import path from "node:path";

const pathInfo = path.parse("/home/user/documents/file.txt");
console.log(pathInfo);

返回对象pathInfo中的各属性含义如下表。

属性 说明
root 根路径
dir 文件所在目录
base 文件名(含扩展名)
ext 文件扩展名
name 文件名(不含扩展名)

path.format()

path.format()path.parse()的逆操作,它将路径对象格式化为路径字符串。

import path from "node:path";

const pathStr = path.format({
  dir: "/home/user/documents",
  name: "file",
  ext: ".txt",
});
console.log(pathStr); // /home/user/documents/file.txt

获取路径信息

path.dirname()

path.dirname()用于获取路径中的目录部分。

import path from "node:path";

const dir = path.dirname("/home/user/documents/file.txt");
console.log(dir); // /home/user/documents

path.basename()

path.basename()用于获取路径中的文件名部分,可选第二个参数用于去除扩展名。

import path from "node:path";

const filename1 = path.basename("/home/user/documents/file.txt");
console.log(filename1); // file.txt

// 去除扩展名
const filename2 = path.basename("/home/user/documents/file.txt", ".txt");
console.log(filename2); // file

path.extname()

path.extname()用于获取路径中的扩展名部分。

import path from "node:path";

const ext1 = path.extname("/home/user/documents/file.txt");
console.log(ext1); // .txt

const ext2 = path.extname("/home/user/documents/file.config.js");
console.log(ext2); // .js

const ext3 = path.extname("/home/user/documents/file");
console.log(ext3); // 空字符串

路径判断与转换

path.isAbsolute()

path.isAbsolute()用于判断路径是否为绝对路径。

import path from "node:path";

console.log(path.isAbsolute("/home/user")); // true
console.log(path.isAbsolute("./src/index.js")); // false
console.log(path.isAbsolute("src/index.js")); // false

path.relative()

path.relative()用于计算从一个路径到另一个路径的相对路径。

import path from "node:path";

const rel1 = path.relative("/home/user/documents", "/home/user/pictures");
console.log(rel1); // ../pictures

const rel2 = path.relative("/home/user", "/home/user/documents/file.txt");
console.log(rel2); // documents/file.txt

path.normalize()

path.normalize()用于规范化路径,处理其中的...和多余的分隔符。

import path from "node:path";

const p1 = path.normalize("/home/user/../admin/./documents//file.txt");
console.log(p1); // /home/admin/documents/file.txt

const p2 = path.normalize("src//components/../utils/./index.js");
console.log(p2); // src/utils/index.js

平台相关

path.sep

path.sep属性返回当前操作系统的路径分隔符。Windows会返回\,Linux则会返回/

import path from "node:path";

console.log(path.sep);

path.delimiter

path.delimiter属性返回当前操作系统的环境变量路径分隔符。Windows中通常是;,Linux下则是:

import path from "node:path";

console.log(path.delimiter);

// 解析PATH环境变量
const paths = process.env.PATH.split(path.delimiter);
console.log(paths);

跨平台路径处理

path模块还提供了path.posixpath.win32两个子模块,用于在任意平台上使用特定平台的路径处理逻辑。

import path from "node:path";

// 强制使用POSIX风格(Linux/macOS)
const posixPath = path.posix.join("home", "user", "file.txt");
console.log(posixPath);

// 强制使用Windows风格
const win32Path = path.win32.join("home", "user", "file.txt");
console.log(win32Path);
作者:Gacfox
版权声明:本网站为非盈利性质,文章如非特殊说明均为原创,版权遵循知识共享协议CC BY-NC-ND 4.0进行授权,转载必须署名,禁止用于商业目的或演绎修改后转载。