错误:EMFILE:打开的文件太多

Error: EMFILE: too many open files

本文关键字:文件 太多 EMFILE 错误      更新时间:2023-09-26

使用 nw.js,我只是尝试将图像保存在具有不同随机名称的 img 元素数组中。

但是有一些错误,我的代码有问题吗?

for (i = 0; i < imgs.length; i++) {
 request(imgs[i].getAttribute('src')).on('error', function(err) {
  throw err
 }).pipe(fs.createWriteStream('data/imgs/' + randomString))
}

imgs[] 是一个 100-500 个 HTML img 元素的数组,但我正在接收

Error: EMFILE: too many open files, open *<directory>*

还有一个错误:

"Uncaught Error: socket hang up"

虽然它保存了一些图像,但其中一些图像已损坏,并且它创建的图像比实际存在的图像多。

使用graceful-fs模块,它是fs模块的直接替代品。它是本机fs模块的包装器。引用graceful-fs模块的文档,

openreaddir调用进行排队,如果文件描述符过多出现EMFILE错误,则在关闭时重试这些调用。

由于它公开与本机fs模块相同的 API,因此您可以像使用普通fs模块一样使用它。

// use just like fs
var fs = require('graceful-fs');

注意:这个库是由Isaac Z. Schlueter创建的,他是Node.js的核心开发人员之一。

另一个简单的解决方案是等待文件下载,然后才使用递归打开新请求:

var fs = require('fs');
var request = require('request');
var dest = '../data/downloads/';
function _saveAllFiles (fileUrlArray, curIdx, options) {
    try {
        var count = fileUrlArray.length - 1;
        var curFile = fileUrlArray[curIdx];
        var stream = request(curFile)
            .pipe(fs.createWriteStream(dest + "file_" + curIdx));
        stream.on('finish', function () {
            console.log("Downloaded", curFile);
            stream.close();
            if (curIdx + 1 < count) {
                //Finished, download next file
                _saveAllFiles(fileArray, curIdx + 1, options);
            }
        });
        stream.on('error', function () {
            console.log("Error", curFile);
            stream.close();
            stream.end();
            if (curIdx + 1 < count) {
                //Error occured, go to next file
                _saveAllFiles(fileArray, curIdx + 1, options);
            }
        });
    } catch (err) {
        console.error("Failed to download file", err);
    }
}