在 Node.js 中操作文件系统:完整指南
在现代 Web 开发中,高效操作文件系统是后端开发人员的关键技能之一。Node.js 提供了强大且灵活的 fs(File System)模块,允许执行所有基本的文件和目录操作:读取、写入、删除、重命名等。在本文中,我们将详细讲解如何在 Node.js 中操作文件系统,介绍同步和异步方法,并学习路径操作。
导入 fs 模块及基本原则
要在 Node.js 中开始操作文件系统,需要导入内置的 fs 模块。只需一行代码即可完成:
const fs = require('fs');fs 模块同时提供同步和异步方法。异步方法通常将 callback 函数作为最后一个参数,并且是生产环境代码的首选,因为它们不会阻塞 event loop。同步方法以 Sync 结尾,在应用程序初始化或脚本中可能很有用。
此外,从 Node.js 10 开始,可以使用 fs/promises——返回 promise 的方法版本:
const fs = require('fs/promises');在本文中,我们将主要使用基于 promise 的异步方法,因为它是最现代且方便的方式。
在 Node.js 中读取文件
读取文件是最常见的操作之一。我们来看三种主要方式。
一次性读取整个文件(异步)
fs.readFile() 方法将文件内容完全读入内存。这适用于小文件。
const fs = require('fs/promises');
async function readFileExample() { try { const data = await fs.readFile('example.txt', 'utf8'); console.log('文件内容:', data); } catch (err) { console.error('读取文件时出错:', err); }}
readFileExample();逐行读取文件(流式读取)
对于大文件,最好使用流(streams)或通过 readline 逐行读取:
const fs = require('fs');const readline = require('readline');
async function readFileLineByLine() { const fileStream = fs.createReadStream('large-file.txt'); const rl = readline.createInterface({ input: fileStream, crlfDelay: Infinity });
for await (const line of rl) { console.log('行:', line); }}
readFileLineByLine();同步读取
如果你需要立即读取文件并且可以阻塞执行:
const fs = require('fs');
try { const data = fs.readFileSync('example.txt', 'utf8'); console.log(data);} catch (err) { console.error(err);}写入和更新文件
Node.js 提供了几种将数据写入文件的方法。
写入文件(覆盖)
fs.writeFile() 方法创建新文件或覆盖现有文件:
const fs = require('fs/promises');
async function writeFileExample() { try { await fs.writeFile('output.txt', '你好,世界!', 'utf8'); console.log('文件写入成功'); } catch (err) { console.error('写入错误:', err); }}
writeFileExample();在文件末尾追加数据
如果需要添加数据而不删除现有内容,请使用 fs.appendFile():
const fs = require('fs/promises');
async function appendToFile() { try { await fs.appendFile('log.txt', `新记录: ${new Date()}`); console.log('数据已添加'); } catch (err) { console.error('错误:', err); }