Node.js核心模块fs文件系统和path路径模块完全指南
前言
大家好,今天咱们来聊聊Node.js里最常用的两个核心模块——fs(文件系统)和path(路径处理)。不管你是写Web服务器、做命令行工具,还是处理各种文件操作,这两个模块都是绕不开的。
别看它们名字简单,用好了能帮你省不少功夫,用错了那就是一堆坑。我会把这些年的实战经验都抖出来,保证让你看完就能上手。
fs模块——文件操作全搞定
1. 读取文件
最常用的就是readFile方法,异步读取,简单粗暴:
const fs = require('fs');
// 读取文件(异步)
fs.readFile('./test.txt', 'utf8', (err, data) => {
if (err) {
console.error('读取失败:', err);
return;
}
console.log('文件内容:', data);
});
// 同步读取(不推荐用于生产环境)
const content = fs.readFileSync('./test.txt', 'utf8');
console.log(content);
2. 写入文件
写入文件有writeFile和appendFile两种:
// 写入文件(会覆盖原有内容)
fs.writeFile('./output.txt', 'Hello Node.js!', 'utf8', (err) => {
if (err) throw err;
console.log('文件写入成功');
});
// 追加内容
fs.appendFile('./log.txt', '新的一行\n', 'utf8', (err) => {
if (err) throw err;
console.log('追加成功');
});
3. 检查文件是否存在
// 方法一:access
fs.access('./file.txt', fs.constants.F_OK, (err) => {
console.log(err ? '文件不存在' : '文件存在');
});
// 方法二:existsSync(同步版本)
if (fs.existsSync('./file.txt')) {
console.log('文件存在');
}
4. 创建和删除目录
// 创建目录
fs.mkdir('./新文件夹', { recursive: true }, (err) => {
if (err) throw err;
console.log('目录创建成功');
});
// 删除目录
fs.rmdir('./旧文件夹', { recursive: true }, (err) => {
if (err) throw err;
console.log('目录删除成功');
});
5. 复制、移动、删除文件
// 复制文件
fs.copyFile('./source.txt', './dest.txt', (err) => {
if (err) throw err;
console.log('复制成功');
});
// 删除文件
fs.unlink('./file.txt', (err) => {
if (err) throw err;
console.log('删除成功');
});
path模块——路径处理不头疼
1. 路径拼接
const path = require('path');
// 拼接路径(自动处理分隔符)
const fullPath = path.join(__dirname, 'src', 'utils', 'helper.js');
console.log(fullPath);
// 输出:/Users/xxx/project/src/utils/helper.js
2. 解析路径信息
const filePath = '/home/user/project/index.js';
console.log(path.basename(filePath)); // index.js(文件名)
console.log(path.extname(filePath)); // .js(扩展名)
console.log(path.dirname(filePath)); // /home/user/project(目录)
console.log(path.parse(filePath)); // 解析为对象
/*
{
root: '/',
dir: '/home/user/project',
base: 'index.js',
ext: '.js',
name: 'index'
}
*/
3. 路径解析和格式化
// 相对路径转绝对路径
console.log(path.resolve('./index.js'));
// 输出:/Users/xxx/currentDir/index.js
// 格式化路径对象
const parsed = {
dir: '/home/user/project',
name: 'app',
ext: '.js'
};
console.log(path.format(parsed)); // /home/user/project/app.js
4. 路径规范化
// 处理路径中的..和.,去除多余分隔符
console.log(path.normalize('/home//user/../project//index.js'));
// 输出:/home/project/index.js
实战案例:日志系统
说了这么多,来个实际例子。咱们写一个简单的日志系统:
const fs = require('fs');
const path = require('path');
class Logger {
constructor(logDir) {
this.logDir = logDir;
// 确保日志目录存在
if (!fs.existsSync(logDir)) {
fs.mkdirSync(logDir, { recursive: true });
}
}
getLogFileName() {
const date = new Date();
const year = date.getFullYear();
const month = String(date.getMonth() + 1).padStart(2, '0');
return `app-${year}${month}.log`;
}
log(level, message) {
const timestamp = new Date().toISOString();
const logLine = `[${timestamp}] [${level}] ${message}\n`;
const logFile = path.join(this.logDir, this.getLogFileName());
fs.appendFile(logFile, logLine, 'utf8', (err) => {
if (err) console.error('写日志失败:', err);
});
}
info(msg) { this.log('INFO', msg); }
error(msg) { this.log('ERROR', msg); }
warn(msg) { this.log('WARN', msg); }
}
// 使用
const logger = new Logger('./logs');
logger.info('服务启动成功');
logger.error('数据库连接失败');
运行后,你会在logs目录下看到按月份命名的日志文件,格式如下:
[2026-04-03T08:40:00.000Z] [INFO] 服务启动成功
[2026-04-03T08:40:01.000Z] [ERROR] 数据库连接失败
常见坑和最佳实践
1. 路径问题
// ❌ 错误:相对路径在不同工作目录可能出错
fs.readFile('./data.json');
// ✅ 正确:使用__dirname获取绝对路径
fs.readFile(path.join(__dirname, 'data.json'));
2. 中文编码
// ❌ 可能乱码
fs.readFile('./file.txt', 'utf8');
// ✅ 指定编码
fs.readFile('./file.txt', { encoding: 'utf8' });
3. 大文件处理
对于大文件,别用readFile,用流:
const fs = require('fs');
const readStream = fs.createReadStream('./bigfile.mp4');
const writeStream = fs.createWriteStream('./copy.mp4');
readStream.pipe(writeStream);
writeStream.on('finish', () => console.log('复制完成'));
4. 错误处理
一定要记得处理错误,不然程序说崩就崩:
fs.readFile('./file.txt', 'utf8', (err, data) => {
if (err) {
console.error('错误:', err.message);
return;
}
console.log(data);
});
总结
fs和path是Node.js开发中最基础的两个模块,看起来简单,但里面的门道不少。今天我们学了:
- fs模块:文件读写、目录操作、文件复制删除
- path模块:路径拼接、解析、规范化
- 实战技巧:日志系统、编码处理、大文件流处理
记住这些最佳实践,能帮你避开不少坑。