Node.js path 模块
Node.js 的 path
模块是一个内置的核心模块,专门用于处理文件和目录路径。
path 提供了一系列实用方法,可以让你在不同操作系统环境下安全、高效地操作文件路径。
为什么需要 path 模块
不同操作系统使用不同的路径分隔符:
- Windows 使用反斜杠
\
- Unix/Linux/macOS 使用正斜杠
/
path
模块会自动处理这些差异,让你的代码在不同平台上都能正常工作。
path 模块的基本用法
引入 path 模块
const path = require('path');
常用方法
1. path.join([...paths]) - 连接路径
实例
const fullPath = path.join('/user', 'documents', 'file.txt');
console.log(fullPath);
// 在 Unix 上输出: /user/documents/file.txt
// 在 Windows 上输出: \user\documents\file.txt
console.log(fullPath);
// 在 Unix 上输出: /user/documents/file.txt
// 在 Windows 上输出: \user\documents\file.txt
2. path.resolve([...paths]) - 解析绝对路径
实例
const absolutePath = path.resolve('src', 'app.js');
console.log(absolutePath);
// 输出当前工作目录下的绝对路径,如: /home/user/project/src/app.js
console.log(absolutePath);
// 输出当前工作目录下的绝对路径,如: /home/user/project/src/app.js
3. path.basename(path[, ext]) - 获取文件名
实例
console.log(path.basename('/user/docs/file.txt')); // file.txt
console.log(path.basename('/user/docs/file.txt', '.txt')); // file
console.log(path.basename('/user/docs/file.txt', '.txt')); // file
4. path.dirname(path) - 获取目录名
实例
console.log(path.dirname('/user/docs/file.txt')); // /user/docs
5. path.extname(path) - 获取扩展名
实例
console.log(path.extname('index.html')); // .html
console.log(path.extname('file')); // 空字符串
console.log(path.extname('file')); // 空字符串
跨平台路径处理
路径分隔符
path.sep
- 平台特定的路径分隔符console.log(path.sep); // Windows 输出 '\', Unix 输出 '/'
path.delimiter
- 平台特定的路径分隔符(用于 PATH 环境变量)console.log(path.delimiter); // Windows 输出 ';', Unix 输出 ':'
路径规范化
使用 path.normalize(path)
可以规范化路径,处理多余的 .
、..
和分隔符:
实例
console.log(path.normalize('/user//docs/../file.txt')); // /user/file.txt
路径解析与格式转换
path.parse(path) - 解析路径为对象
实例
const pathObj = path.parse('/user/docs/file.txt');
console.log(pathObj);
/*
{
root: '/',
dir: '/user/docs',
base: 'file.txt',
ext: '.txt',
name: 'file'
}
*/
console.log(pathObj);
/*
{
root: '/',
dir: '/user/docs',
base: 'file.txt',
ext: '.txt',
name: 'file'
}
*/
path.format(pathObject) - 从对象构建路径
实例
const pathStr = path.format({
dir: '/user/docs',
name: 'file',
ext: '.txt'
});
console.log(pathStr); // /user/docs/file.txt
dir: '/user/docs',
name: 'file',
ext: '.txt'
});
console.log(pathStr); // /user/docs/file.txt
实际应用示例
示例 1: 构建跨平台的文件路径
实例
const configPath = path.join(__dirname, 'config', 'settings.json');
console.log(configPath);
console.log(configPath);
示例 2: 处理用户上传的文件
实例
function saveUploadedFile(uploadDir, originalName) {
const ext = path.extname(originalName);
const baseName = path.basename(originalName, ext);
const timestamp = Date.now();
const newFileName = `${baseName}_${timestamp}${ext}`;
return path.join(uploadDir, newFileName);
}
const ext = path.extname(originalName);
const baseName = path.basename(originalName, ext);
const timestamp = Date.now();
const newFileName = `${baseName}_${timestamp}${ext}`;
return path.join(uploadDir, newFileName);
}
示例 3: 检查文件扩展名
实例
function isImageFile(filename) {
const ext = path.extname(filename).toLowerCase();
return ['.jpg', '.jpeg', '.png', '.gif'].includes(ext);
}
const ext = path.extname(filename).toLowerCase();
return ['.jpg', '.jpeg', '.png', '.gif'].includes(ext);
}
方法与属性
path 模块的方法与属性如下表:
方法 | 描述 | 示例 |
---|---|---|
path.basename(path[, ext]) | 返回路径中的最后一部分(文件名)。可选参数 ext 用于去除文件扩展名。 | path.basename('/foo/bar/baz.txt'); // 输出: 'baz.txt' |
path.dirname(path) | 返回路径中的目录部分。 | path.dirname('/foo/bar/baz.txt'); // 输出: '/foo/bar' |
path.extname(path) | 返回路径中文件的扩展名。 | path.extname('/foo/bar/baz.txt'); // 输出: '.txt' |
path.join([...paths]) | 将多个路径拼接为一个路径,自动处理路径分隔符。 | path.join('/foo', 'bar', 'baz/asdf', 'quux', '..'); // 输出: '/foo/bar/baz/asdf' |
path.resolve([...paths]) | 将路径序列解析为绝对路径,从右到左依次处理每个路径片段,直到构建出一个绝对路径为止。 | path.resolve('/foo/bar', './baz'); // 输出: '/foo/bar/baz' |
path.normalize(path) | 规范化路径,删除冗余的 . 和 .. ,并根据当前操作系统替换路径分隔符。 | path.normalize('/foo/bar//baz/asdf/quux/..'); // 输出: '/foo/bar/baz/asdf' |
path.isAbsolute(path) | 检查路径是否为绝对路径。 | path.isAbsolute('/foo/bar'); // 输出: true |
path.relative(from, to) | 返回从 from 路径到 to 路径的相对路径。 | path.relative('/foo/bar/baz', '/foo/bar/qux'); // 输出: '../qux' |
path.parse(path) | 将路径字符串解析为对象,包含 root 、dir 、base 、ext 和 name 属性。 | path.parse('/home/user/dir/file.txt'); 输出:{ root: '/', dir: '/home/user/dir', base: 'file.txt', ...} |
path.format(pathObject) | 将路径对象格式化为路径字符串,与 path.parse 相反。 | path.format({ root: '/', dir: '/home/user/dir', base: 'file.txt' }); // 输出: '/home/user/dir/file.txt' |
path.sep | 提供当前操作系统的路径分隔符(POSIX 为 '/' ,Windows 为 '\' )。 | console.log(path.sep); // 输出: '\' (Windows) 或 '/' (POSIX) |
path.delimiter | 提供路径分隔符(环境变量中路径的分隔符),POSIX 为 : ,Windows 为 ; 。 | console.log(path.delimiter); // 输出: ';' (Windows) 或 ':' (POSIX) |
实例
创建 main.js 文件,代码如下所示:
实例
const path = require('path');
// 获取文件名
console.log('文件名:', path.basename('/foo/bar/baz.txt')); // 输出: 'baz.txt'
// 获取目录名
console.log('目录名:', path.dirname('/foo/bar/baz.txt')); // 输出: '/foo/bar'
// 获取扩展名
console.log('扩展名:', path.extname('/foo/bar/baz.txt')); // 输出: '.txt'
// 拼接路径
console.log('拼接路径:', path.join('/foo', 'bar', 'baz/asdf', 'quux', '..')); // 输出: '/foo/bar/baz/asdf'
// 解析绝对路径
console.log('绝对路径:', path.resolve('/foo/bar', './baz')); // 输出: '/foo/bar/baz'
// 规范化路径
console.log('规范化路径:', path.normalize('/foo/bar//baz/asdf/quux/..')); // 输出: '/foo/bar/baz/asdf'
// 判断是否为绝对路径
console.log('是否为绝对路径:', path.isAbsolute('/foo/bar')); // 输出: true
// 相对路径
console.log('相对路径:', path.relative('/foo/bar/baz', '/foo/bar/qux')); // 输出: '../qux'
// 解析路径为对象
const parsedPath = path.parse('/home/user/dir/file.txt');
console.log('解析路径为对象:', parsedPath);
// 输出: { root: '/', dir: '/home/user/dir', base: 'file.txt', ext: '.txt', name: 'file' }
// 将对象格式化为路径
const formattedPath = path.format(parsedPath);
console.log('格式化路径:', formattedPath); // 输出: '/home/user/dir/file.txt'
// 获取文件名
console.log('文件名:', path.basename('/foo/bar/baz.txt')); // 输出: 'baz.txt'
// 获取目录名
console.log('目录名:', path.dirname('/foo/bar/baz.txt')); // 输出: '/foo/bar'
// 获取扩展名
console.log('扩展名:', path.extname('/foo/bar/baz.txt')); // 输出: '.txt'
// 拼接路径
console.log('拼接路径:', path.join('/foo', 'bar', 'baz/asdf', 'quux', '..')); // 输出: '/foo/bar/baz/asdf'
// 解析绝对路径
console.log('绝对路径:', path.resolve('/foo/bar', './baz')); // 输出: '/foo/bar/baz'
// 规范化路径
console.log('规范化路径:', path.normalize('/foo/bar//baz/asdf/quux/..')); // 输出: '/foo/bar/baz/asdf'
// 判断是否为绝对路径
console.log('是否为绝对路径:', path.isAbsolute('/foo/bar')); // 输出: true
// 相对路径
console.log('相对路径:', path.relative('/foo/bar/baz', '/foo/bar/qux')); // 输出: '../qux'
// 解析路径为对象
const parsedPath = path.parse('/home/user/dir/file.txt');
console.log('解析路径为对象:', parsedPath);
// 输出: { root: '/', dir: '/home/user/dir', base: 'file.txt', ext: '.txt', name: 'file' }
// 将对象格式化为路径
const formattedPath = path.format(parsedPath);
console.log('格式化路径:', formattedPath); // 输出: '/home/user/dir/file.txt'
点我分享笔记