typescript 在readFileSync之后显式关闭文件

vs91vp4v  于 2023-03-24  发布在  TypeScript
关注(0)|答案(1)|浏览(176)

我们的系统有(明显)太多打开的文件:

Error: EMFILE: too many open files

我们是否应该在以下情况下显式关闭文件:

import * as fs from 'fs';
for (const filename in filenames) {
  const text = fs.readFileSync(filename).toString();
  // explictly close the file? how?
}

似乎规范的答案(如this one)没有提到它。

4nkexdtk

4nkexdtk1#

下面是一个用openSynccloseSync Package readFileSync的解决方案:

import { openSync, closeSync, readFileSync, writeFileSync } from 'fs'

const d1 = openSync('input.json', 'r')
const data = readFileSync(d1).toString();
closeSync(d1)

const parsedData = JSON.parse(data)
const filenames = new Array<string>();

for (const n of parsedData) {
  filenames.push(n['name']);
}

let mydata = [];
for (const filename of filenames) {
  const d = openSync(filename, 'r')
  mydata.push(readFileSync(d).toString())
  closeSync(d)
}

console.log(mydata.length)

它在一个循环中打开+读取+关闭100,000个文件,没有任何问题:

$ grep -rn "\"name\": " input.json | wc -l
100001
$ npx tsc main.ts                         
$ node ./main.js                          
100001

相关问题