用普通的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');
  }
}

评论

0 / 800
全部评论()