Node.js 文件操作教程

Node.js 文件操作教程

1. 文件系统模块介绍

Node.js提供了fs(File System)模块来处理文件操作。这是一个内置模块,不需要额外安装。使用前,需要先引入:

javascript 复制代码
const fs = require('fs');
// 或使用 Promise API
const fsPromises = require('fs').promises;

2. 同步vs异步操作

Node.js的文件操作提供了同步和异步两种方式。异步方式是推荐的做法,因为它不会阻塞事件循环。

异步示例:

javascript 复制代码
fs.readFile('example.txt', 'utf8', (err, data) => {
    if (err) {
        console.error('读取文件失败:', err);
        return;
    }
    console.log('文件内容:', data);
});

同步示例:

javascript 复制代码
try {
    const data = fs.readFileSync('example.txt', 'utf8');
    console.log('文件内容:', data);
} catch (err) {
    console.error('读取文件失败:', err);
}

使用 Promise:

javascript 复制代码
async function readFileContent() {
    try {
        const data = await fsPromises.readFile('example.txt', 'utf8');
        console.log('文件内容:', data);
    } catch (err) {
        console.error('读取文件失败:', err);
    }
}

3. 基本文件操作

3.1 创建和写入文件

javascript 复制代码
// 写入文件(覆盖已有内容)
fs.writeFile('test.txt', '你好,Node.js!', 'utf8', (err) => {
    if (err) throw err;
    console.log('文件已被保存');
});

// 追加内容到文件
fs.appendFile('test.txt', '\n新的一行内容', 'utf8', (err) => {
    if (err) throw err;
    console.log('内容已追加');
});

3.2 读取文件

javascript 复制代码
// 完整读取
fs.readFile('test.txt', 'utf8', (err, data) => {
    if (err) throw err;
    console.log(data);
});

// 部分读取
const buffer = Buffer.alloc(1024);
fs.open('test.txt', 'r', (err, fd) => {
    if (err) throw err;
    fs.read(fd, buffer, 0, buffer.length, 0, (err, bytesRead, buffer) => {
        if (err) throw err;
        console.log(buffer.slice(0, bytesRead).toString());
        fs.close(fd, (err) => {
            if (err) throw err;
        });
    });
});

3.3 检查文件状态

javascript 复制代码
fs.stat('test.txt', (err, stats) => {
    if (err) throw err;
    console.log('文件大小:', stats.size);
    console.log('是否为文件:', stats.isFile());
    console.log('是否为目录:', stats.isDirectory());
    console.log('最后修改时间:', stats.mtime);
});

4. 目录操作

4.1 创建目录

javascript 复制代码
fs.mkdir('新目录', { recursive: true }, (err) => {
    if (err) throw err;
    console.log('目录创建成功');
});

4.2 读取目录内容

javascript 复制代码
fs.readdir('目录路径', (err, files) => {
    if (err) throw err;
    files.forEach(file => {
        console.log(file);
    });
});

4.3 删除目录

javascript 复制代码
fs.rmdir('目录路径', { recursive: true }, (err) => {
    if (err) throw err;
    console.log('目录删除成功');
});

5. 流式操作

对于大文件,使用流式操作可以提高效率并减少内存使用。

5.1 读取流

javascript 复制代码
const readStream = fs.createReadStream('大文件.txt', {
    encoding: 'utf8',
    highWaterMark: 1024 // 设置缓冲区大小
});

readStream.on('data', (chunk) => {
    console.log('接收到数据片段:', chunk);
});

readStream.on('end', () => {
    console.log('读取完成');
});

readStream.on('error', (err) => {
    console.error('读取错误:', err);
});

5.2 写入流

javascript 复制代码
const writeStream = fs.createWriteStream('输出.txt');

writeStream.write('第一行数据\n');
writeStream.write('第二行数据\n');

writeStream.end('写入完成');

writeStream.on('finish', () => {
    console.log('写入已完成');
});

writeStream.on('error', (err) => {
    console.error('写入错误:', err);
});

5.3 管道操作

javascript 复制代码
const readStream = fs.createReadStream('源文件.txt');
const writeStream = fs.createWriteStream('目标文件.txt');

readStream.pipe(writeStream);

6. 实践建议

  1. 错误处理:始终做好错误处理,使用 try-catch 或回调函数处理可能的错误。

  2. 路径处理:使用 path 模块处理文件路径,避免跨平台问题:

javascript 复制代码
const path = require('path');
const filePath = path.join(__dirname, 'files', 'example.txt');
  1. 异步操作:优先使用异步方法,避免阻塞事件循环。

  2. 大文件处理:处理大文件时使用流式操作,避免内存溢出。

  3. 权限检查:在进行文件操作前检查权限:

javascript 复制代码
fs.access('文件路径', fs.constants.W_OK, (err) => {
    if (err) {
        console.error('没有写入权限');
        return;
    }
    // 继续操作
});
相关推荐
Python私教33 分钟前
把开源 Agent 打包成"解压双击即用"的 Windows 便携包:一条命令的完整实现
node.js
没事别瞎琢磨3 小时前
十一、审计与 Run Session——每一步操作都被记录
人工智能·node.js
没事别瞎琢磨3 小时前
十六、AgentSandbox——把所有模块串起来的编排类
人工智能·node.js
没事别瞎琢磨3 小时前
十二、网络代理与白名单规则引擎
人工智能·node.js
没事别瞎琢磨3 小时前
十四、Git Worktree 隔离执行
人工智能·node.js
没事别瞎琢磨4 小时前
十、统一 Runner 入口——能力检测与模式回退
人工智能·node.js
没事别瞎琢磨4 小时前
八、环境隔离——构建安全的子进程环境
人工智能·node.js
没事别瞎琢磨5 小时前
六、输出捕获与截断
人工智能·node.js
没事别瞎琢磨5 小时前
七、敏感路径预检——Protected Paths
人工智能·node.js
没事别瞎琢磨6 小时前
五、进程执行——spawn、超时与进程树清理
人工智能·node.js