簡體   English   中英

錯誤:EMFILE:打開的文件太多

[英]Error: EMFILE: too many open files

使用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);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM