nodejs常用文件操作

木头的喵喵拖孩

简单文件操作

如果是要操作体积很大的文件,建议参考章节传统文件操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
const fs = require("fs");

// 同步读取文件内容(如果指定了编码,则返回字符串,否则返回一个Buffer对象)
const fileContent = fs.readFileSync("./file.txt", "utf8");
console.log(fileContent);

// 异步读取文件内容(如果指定了编码,则返回字符串,否则返回一个Buffer对象)
fs.readFile("./file.txt", "utf8", (err, fileContent) => {
if (err) throw err;
console.log(fileContent);
});

// 同步写入文件内容(默认覆盖文件,不存在则创建)
fs.writeFileSync("./file.txt", "hello world sync", "utf8");

// 异步写入文件内容(默认覆盖文件,不存在则创建)
fs.writeFile("./file.txt", "hello world async", "utf8", (err) => {
if (err) throw err;
});

// 同步追加文件内容
fs.appendFileSync("./file.txt", "hello world append sync", "utf8");

// 异步追加文件内容
fs.appendFile("./file.txt", "hello world append async");

// 同步删除文件
fs.unlinkSync("./file.txt");

// 异步删除文件
fs.unlink("./file.txt", (err) => {
if (err) throw err;
});

// 同步创建文件夹
fs.mkdirSync("./dir");

// 异步创建文件夹
fs.mkdir("./dir", (err) => {
if (err) throw err;
});

递归遍历文件夹

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
const fs = require("fs");
const path = require("path");

// 递归遍历文件夹(同步)
function folderRecursionSync(pathName, callback) {
const pathStat = fs.statSync(pathName);

const pathInfo = {
// 获取路径信息
// pathStat,
// 是否是文件
// isFile: pathStat.isFile(),
// 是否是文件夹
isDirectory: pathStat.isDirectory(),
// 获取相对路径
relativePathName: pathName,
// 获取绝对路径
absolutePathName: path.resolve(pathName),
};

callback(pathInfo);

if (pathInfo.isDirectory) {
const _pathNames = fs.readdirSync(pathName); // 获取文件夹下的所有文件名
for (const _pathName of _pathNames) {
folderRecursionSync(path.join(pathName, _pathName), callback);
}
}
}

// 递归遍历文件夹(异步)
function folderRecursion(pathName, callback) {
fs.stat(pathName, (err, pathStat) => {
if (err) throw err;
const pathInfo = {
// 获取路径信息
// pathStat,
// 是否是文件
// isFile: pathStat.isFile(),
// 是否是文件夹
isDirectory: pathStat.isDirectory(),
// 获取相对路径
relativePathName: pathName,
// 获取绝对路径
absolutePathName: path.resolve(pathName),
};

callback(pathInfo);

if (pathInfo.isDirectory) {
fs.readdir(pathName, (err, _pathNames) => {
// 获取文件夹下的所有文件名
if (err) throw err;
for (const _pathName of _pathNames) {
folderRecursion(path.join(pathName, _pathName), callback);
}
});
}
});
}

传统文件操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
const fs = require("fs");

// 创建文件流对象(读)
const rs = fs.createReadStream("./file.txt", {
encoding: "utf8", // 设置编码格式,设置了后,on('data')返回的都是String,否则是Buffer
// flags: 'r', // 设置文件打开的方式,默认是r
// start: 10, // 设置读取的起始位置
// end: 20, // 设置读取的结束位置
// mode: 0o666, // 设置读取文件模式,4:可读,2:可写,1:可执行
// highWaterMark: 10, // 设置每次on('data')读取的字节数
});
let fileContent = "";
rs.on("data", (chunk) => {
fileContent += chunk;
});
rs.on("open", (fd) => {
console.log("开始读取文件");
});
rs.on("end", () => {
console.log("文件已全部读取完毕,文件内容:", fileContent.toString());
});
rs.on("close", () => {
console.log("文件被关闭");
});
rs.on("error", (err) => {
console.log("读取文件失败", err);
});

// 创建文件流对象(写)
const ws = fs.createWriteStream("./file.txt", {
encoding: "utf8", // 设置编码格式
// flags: 'a', // 设置写入文件的方式,默认是w,a是追加
// mode: 0o666, // 设置写入文件的权限,4:可读,2:可写,1:可执行
// start: 10, // 设置写入的起始位置
// highWaterMark: 3, // 设置每次写入的字节数
});

ws.write("hello world1"); // 如果没有设置encoding,可以传入一个Buffer
ws.end("hello world2", () => {
console.log("文件写入完毕,写入数量:", ws.bytesWritten);
});

ws.on("open", () => {
console.log("文件被打开了");
});
ws.on("close", () => {
console.log("文件被关闭了");
});
ws.on("drain", () => {
console.log("写入数据超过highWaterMark,暂停写入"); // 但是本次写入是可以成功的
});
ws.on("error", (err) => {
console.log("写入文件失败", err);
});

Buffer

在读写文件时,如果不指定编码,则默认操作二进制对象 Buffer。
Buffer 是一个类数组对象,其存放一定长度的字节序列。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
const fs = require("fs");

// 创建Buffer
let buf1 = fs.readFileSync("file.obj"); // 从二进制文件创建,不指定encoding
let buf2 = Buffer.alloc(1024); // 指定长度创建空Buffer:<Buffer 00 00 00 …… 一共1024个00>
let buf3 = Buffer.from([1, 2, 8, 16, 255, 256]); // 从十进制数组创建,这里每个元素不能超过一个字节(256),否则会溢出:<Buffer 01 02 08 10 ff 00>

// String转Buffer
let buf4 = Buffer.from("hello world", "utf8"); // <Buffer 68 65 6c 6c 6f 20 77 6f 72 6c 64>

// Buffer转String
let str1 = buf3.toString("hex"); // 将Buffer转为16进制字符串:'01020810ff00'
let str2 = buf3.toString("utf8"); // 将Buffer转为utf8字符串,可能会乱码
let str3 = buf4.toString("hex"); // '68656c6c6f20776f726c64'
let str4 = buf4.toString("utf8"); // 'hello world'

参考

Node.js 中的 fs 模块(三)
【Nodejs】一、Buffer(缓冲器)学习

  • 标题: nodejs常用文件操作
  • 作者: 木头的喵喵拖孩
  • 创建于: 2024-10-28 16:23:19
  • 更新于: 2024-10-29 11:34:23
  • 链接: https://blog.xx-xx.top/2024/10/28/nodejs常用文件操作/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。