用普通的fs.readdir
方法会一开始就读取所有的文件并创建数组,当文件数量级特别大的时候就很慢也可能会爆内存。
此时可以用 fs.promises.opendir
可以用流去随读随取,类似文件流读取文件。
以下是删除某个文件夹下所有文件的例子(实际在这里删除了近千万个文件,因为双系统这个D盘实际是我电脑的C盘,这上千万个文件占了40G的容量.....):
const fs = require('fs');
const path = require('path');
const p = 'D:\\Users\\xxx\\AppData\\Roaming\\Microsoft\\Crypto\\RSA\\S-1-5-21-xxxxxx';
console.time('1');
delFilesByStream().then(() => {
console.timeEnd('1');
});
async function delFilesByStream() {
try {
const dir = await fs.promises.opendir(p);
let count = 0;
for await (const d of dir) {
count++;
fs.rmSync(path.resolve(p, d.name));
if (count % 10000 === 0) {
console.log('cur', count);
}
}
console.log('del count', count);
} catch {
console.log('error');
}
}
评论