2015-06-14 146 views
3

使用nw.js,我只是試圖將圖像保存在具有不同隨機名稱的img元素數組中。錯誤:EMFILE:打開的文件太多

但有一些錯誤,是我的代碼錯了嗎?

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" 

雖然這樣可以節省一些圖像,一些它們被破壞了,並且它創造的圖像太多而不是實際存在的。

回答

6

使用graceful-fs模塊,這是fs模塊的直接替換模塊。它是本地fs模塊的封裝。引述docs of graceful-fs module

Queues up open and readdir calls, and retries them once something closes if there is an EMFILE error from too many file descriptors.

由於它暴露了相同的API,本地fs模塊,你可以使用它,就像正常的fs模塊。

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

注:這個庫是由創建,艾薩克Z. Schlueter的,對Node.js的核心開發者之一

0

另一種簡單的解決辦法是隻爲了等待要下載的文件,然後才用遞歸打開新的要求:

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); 
    } 
} 
相關問題