Linux 下 Node.js 文件系统操作指南

Linux下Node.js的文件系统如何操作

在 Linux 环境下用 Node.js 操作文件系统,是服务器端开发绕不开的基本功。无论是处理日志、管理配置文件,还是搭建静态文件服务,都离不开对文件的读写、复制和删除。这里先说说核心思路和常见的坑。

核心模块与调用方式

Node.js 的文件系统操作,核心就是内置的 fs 模块。光有它还不够,通常还得配合 path 模块来处理跨平台路径,以及 os 模块来获取系统相关的常量(比如换行符)。这三个组合在一起,基本能覆盖大部分需求。

关于调用风格,Node.js 给了三种选择:

常用的 API 其实就那些,列出来一目了然:

一个小提示:Linux 下路径分隔符是 /,如果想让代码在 Windows 上也跑得通,记得用 path.join 来拼接路径。换行符方面,直接用 os.EOL 就能适配不同系统,省心。

常用操作代码示例

直接上代码,这些都是实际开发中经常用到的组合。

// 1) 读取
const fs = require('fs').promises;
const path = require('path');
const os = require('os');

const file = path.join(__dirname, 'data.txt');
const content = await fs.readFile(file, 'utf8');
console.log(content);

// 2) 写入(覆盖)与追加
await fs.writeFile(file, '第一行\n', { mode: 0o644 }); // 设置文件权限为 0644
await fs.appendFile(file, `追加行 ${os.EOL}`, 'utf8');

// 3) 复制
await fs.copyFile(file, path.join(__dirname, 'data.bak.txt'));

// 4) 目录:创建多级、遍历
await fs.mkdir(path.join(__dirname, 'logs'), { recursive: true });
const files = await fs.readdir(__dirname);
console.log(files);

// 5) 重命名/移动
await fs.rename(
  path.join(__dirname, 'data.bak.txt'),
  path.join(__dirname, 'archive', 'data.txt')
);

// 6) 删除:文件与目录(递归删除)
await fs.unlink(path.join(__dirname, 'archive', 'data.txt'));
await fs.rm('logs', { recursive: true, force: true }); // 递归删除目录

// 7) 状态与类型判断
const st = await fs.stat(file);
console.log(st.isFile(), st.isDirectory());

几点说明:

大文件与性能建议

处理大文件时,最忌讳的就是一口气把整个文件读进内存。这时候就要请出流(Stream)了。

下面是一个用流来复制大文件的示例,通过管道(pipe)高效传输数据:

const fs = require('fs');

const read = fs.createReadStream('big.log', 'utf8');
const write = fs.createWriteStream('big.log.bak');

read.on('error', err => console.error('read error', err));
write.on('error', err => console.error('write error', err));
write.on('finish', () => console.log('copy done'));

read.pipe(write);

如果需要对大文件做逐行处理(比如分析日志),可以用 readline 模块配合流:

const fs = require('fs');
const readline = require('readline');

const rl = readline.createInterface({
  input: fs.createReadStream('big.log', 'utf8'),
  crlfDelay: Infinity
});

for await (const line of rl) {
  // 处理每一行
  console.log(line);
}

流和逐行读取的核心优势,就是在处理大文件时内存占用低、稳定性高。想想看,如果是几个G的日志文件,用 readFile 去读,机器不直接崩了才怪。

权限与跨平台注意

Linux 的权限模型是它的传统强项,但也容易踩坑。设置文件权限可以用 fs.writeFile 的 mode 参数(比如 0o7550o644),或者直接用 fs.chmod / chmodSync 单独修改。一个基本原则:不要给敏感文件设置 0777 这种过于宽泛的权限,这点在 Linux 上尤其值得注意。

路径和换行符是跨平台开发的老生常谈。Linux 路径分隔符是 /,而 Windows 是 \,用 path.joinpath.resolve 就能自动适应。换行符方面,Linux 是 \n,Windows 是 \r\n,直接用 os.EOL 即可统一处理。

编码方面,如果没指定 encoding,fs.readFile 默认返回的是 Buffer,常用的文本编码是 utf8。如果需要处理 GBK 这类非 UTF-8 编码的文件,可以借助 iconv-lite 等库进行转码,自己去写解码逻辑就太折腾了。

本文转载于:https://www.yisu.com/ask/63101853.html 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。