温馨提示×

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

小樊
32
2025-12-06 13:04:43
栏目: 编程语言

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

一 核心模块与调用方式

  • 使用内置模块 fs 完成文件与目录的读写、删除、移动、权限等操作;同时配合 path 处理跨平台路径、os 获取系统相关常量(如换行符)。
  • 三种调用风格:
    • 回调风格:fs.readFile(path, 'utf8', callback)
    • Promise 风格:fs.promises.readFile(path, 'utf8')
    • 同步风格:fs.readFileSync(path, 'utf8')(会阻塞事件循环,适合脚本或启动阶段)
  • 常用 API 一览:
    • 读取:fs.readFile / readFileSync
    • 写入:fs.writeFile / writeFileSync(默认覆盖)
    • 追加:fs.appendFile / appendFileSync
    • 复制:fs.copyFile
    • 目录:fs.mkdir / readdir / rmdir
    • 删除:fs.unlink(文件)、fs.rm / fs.rmdir(目录,支持递归)
    • 重命名/移动:fs.rename
    • 状态:fs.stat / statSync
  • 小提示:Linux 路径分隔符为 /,跨平台请用 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());
  • 说明:
    • writeFile 默认覆盖;需要追加请用 appendFile
    • fs.rm(..., { recursive: true }) 可递归删除目录;旧环境可用 fs.rmdir 配合遍历或第三方库。
    • mode: 0o644 为常见文件权限示例(Linux 权限位)。

三 大文件与性能建议

  • 使用流处理大文件,避免一次性将整个文件读入内存:
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); // 通过管道高效传输
  • 逐行处理文本(适合日志分析等场景):
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);
}
  • 说明:流与逐行读取可显著降低内存占用,提高处理大文件时的稳定性。

四 权限与跨平台注意

  • 权限与模式
    • Linux 使用基于权限的访问控制;设置文件权限可用 fs.writeFilemode 选项(如 0o7550o644),或使用 fs.chmod / chmodSync。避免使用过宽权限(如 0777)存放敏感文件。
  • 路径与换行
    • 路径分隔符:Linux 为 /;跨平台请用 path.joinpath.resolve
    • 换行符:Linux 为 \n;跨平台可用 os.EOL 统一换行。
  • 编码与特殊字符
    • 默认读取为 Buffer(未指定 encoding 时);常用编码为 utf8。如需处理 GBK 等非 UTF-8 文本,可使用 iconv-lite 等库进行转码。

0