概述
node 读写是常见的需求,本文对读、同步写、异步写 简单应用
读取文件夹下所有目录
/**
* 读取文件夹下所有目录
* input 文件夹路径,该参数用于递归使用,初次调用与inputUrl相同
* list 储存目录的数组
* inputUrl 文件夹路径
**/
function readAllFilesSync(input, list, inputUrl) {
// 同步获取文件夹下所有目录
const files = fs.readdirSync(input);
// 勋魂
for (let i = 0; i < files.length; i++) {
const file = files[i];
// 获取目录状态
const stats = fs.statSync(input + file);
// 该目录是否是文件
if (stats.isFile()) {
// 是则存储该目录
list.push(input.replace(inputUrl, "") + file);
} else {
// 不是文件,是文件夹,则递归调用该方法
readAllFilesSync(input + file + "/", list, inputUrl);
}
}
}
读取文件我采用的是同步读取,异步的话也可以,使用 fs.readdir()
写文件
如果你一次性写文件过多的话,会出现打开文件过多的错误,我查阅了一些解决办法,基本都是在系统中改变同时打开最大文件的数量,所以我便采用了同步读写,至于效率,这是一个尴尬的问题,文件数量少,看不到效率差异,文件数量多,异步读写又会出现前面所说的问题。当然,提高效率可以采用多进程方式提升,可参考我写的另一篇博客
异步
/**
* 异步写文件
* input 读取的文件夹目录
* output 写入目录
* list 文件数组
**/
function writeFiles(input, output, list) {
for (const file of list) {
// 获取文件相对于 input 的相对路径
let fileDir = file.split("/");
fileDir.splice(fileDir.length - 1, 1);
fileDir = fileDir.join("/");
const url = output + fileDir;
// 根据目录创建文件夹
fs.mkdir(url, { recursive: true }, () => {
// 读文件
fs.readFile(input + file, (err, res) => {
// 获取的res为buffer,可以使用转换其格式,然后对读取的内容进行修改
// 写文件
fs.writeFile(output + file, res, (err) => {
if (err) console.log(err);
});
});
});
}
}
同步
/**
* 同步写文件
* input 读取的文件夹目录
* output 写入目录
* list 文件数组
**/
function writeFilesSync(input, output, list) {
// 计时
console.time();
for (let i = 0; i < list.length; i++) {
// 获取相对路径
const file = list[i];
let fileDir = file.split("/");
fileDir.splice(fileDir.length - 1, 1);
fileDir = fileDir.join("/");
const url = output + fileDir;
// 创建目录文件夹
fs.mkdirSync(url, { recursive: true });
// 读文件
const res = fs.readFileSync(input + file);
// 写文件
fs.writeFileSync(output + file, res);
// 计时结束
if (i === list.length - 1) console.timeEnd();
}
}
总结
多文件读写本身并不难,但是还是有很多坑去踩,如果你需要提高读写效率,请参考我的另一篇文章。 欢迎来到我的个人博客