保存到文件时出错错误:EMFILE:打开的文件太多

时间:2016-05-12 07:32:11

标签: node.js fs

我正在编写一个代码生成例程并写入文件,但它正在抛出错误

{ [Error: EMFILE: too many open files, open 'C:\\file.txt']
  errno: -4066,
  code: 'EMFILE',
  syscall: 'open',
  path: 'C:\\file.txt' }

for(var i = 0;i<100000;i++) {
    var a = randomString.generate({
        length: 6,
        capitalization: 'uppercase',
        charset:'alphanumeric',
        readable: true
    });
    console.log(a)
    fs.appendFile('C:/file.txt', a + "\r\n", function (err) {
        if (err) return console.log(err);
    });
}

如何解决此错误以及将其存储在文件中的有效方法是什么。我使用了graceful-fs并且它可以正常工作,但需要知道核心node.js fs模块。

2 个答案:

答案 0 :(得分:1)

之前的答案完全没问题。只需共享另一个选项:打开文件一次并多次写入。

var fd = fs.openSync('C:/Work/temp/file.txt', 'w');
for(var i = 0;i<100000;i++) {
    var a = randomString.generate({
        length: 6,
        capitalization: 'uppercase',
        charset:'alphanumeric',
        readable: true
    });
    console.log(a)
    fs.write(fd, a + "\r\n", i * 8 /* offset */, 8 /* length */, function (err) {
        if (err) {
            return console.log(err);
        }
    });
}

答案 1 :(得分:0)

假设您的目标是将100K随机字符串附加到文件中,那么您不应该使用fs.appendFile()。而是使用writable stream将随机字符串附加到文件:

var fs  = require('fs');
var out = fs.createWriteStream('C:/file.txt', { flags : 'a' });

for (var i = 0; i < 100000; i++) {
  var a = randomString.generate({
      length: 6,
      capitalization: 'uppercase',
      charset:'alphanumeric',
      readable: true
  });
  console.log(a)
  out.write(a + '\r\n', 'utf-8');
}
out.end();