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;
    }
    // 继续操作
});
相关推荐
无责任此方_修行中10 小时前
关于 Node.js 原生支持 TypeScript 的总结
后端·typescript·node.js
程序员黄同学11 小时前
解释 Webpack 中的模块打包机制,如何配置 Webpack 进行项目构建?
前端·webpack·node.js
月起星九13 小时前
为什么package.json里的npm和npm -v版本不一致?
前端·npm·node.js
Peter 谭13 小时前
“三小时搞定AI工具开发“:基于MCP的Node.js极简实践
人工智能·node.js
还是鼠鼠17 小时前
Node.js Express 处理静态资源
前端·javascript·vscode·node.js·json·express
阿陈陈陈1 天前
【Node.js入门笔记12---npm包】
笔记·npm·node.js
coding随想1 天前
scss报错Sass @import rules are deprecated and will be removed in Dart Sass 3.0.0
前端·node.js·sass·scss
yang_love10111 天前
Webpack vs Vite:深度对比与实战示例,如何选择最佳构建工具?
前端·webpack·node.js
355984268550552 天前
医保服务平台 Webpack逆向
前端·webpack·node.js
不能只会打代码2 天前
六十天前端强化训练之第三十一天之Webpack 基础配置 大师级讲解(接下来几天给大家讲讲工具链与工程化)
前端·webpack·node.js