我需要打开一个包含文件的目录..打开每个文件的读取流,并将所有文件中的数据写入单个文件。但我一直得到错误:EMFILE,打开'chunks / piece96.data'
我的ulimit是256,我将它增加到1024.我在目录中有127个文件可以打开,读取和写入单个文件。
我的代码在
下面
var DIR='chunks/';
var files=fs.readdirSync(DIR);
var filename='bach.mp3';
files.forEach(function(singlebit){
//console.log(files);
var bit=fs.createReadStream(DIR+singlebit);
var resultfile=fs.createWriteStream(filename,{
flags:'r+',
encoding:null,
mode:0666
});
bit.on('data',function(bitdata){
resultfile.write(bitdata);
console.log(bitdata);
}).on('end',function(){
resultfile.end();
});
});
console.log('file complete');
如何防止EMI文件错误。由于我使用readdirSync而不是一次打开所有文件,因此我不会立即打开多个文件。我需要一种方法来读取所有文件并写入单个文件。
答案 0 :(得分:3)
我刚刚写完了一小段代码来解决这个问题,我不使用流,但这应该适合您的需求:
// Queuing reads and writes, so your nodejs script doesn't overwhelm system limits catastrophically
global.maxFilesInFlight = 100; // Set this value to some number safeish for your system
var origRead = fs.readFile;
var origWrite = fs.writeFile;
var activeCount = 0;
var pending = [];
var wrapCallback = function(cb){
return function(){
activeCount--;
cb.apply(this,Array.prototype.slice.call(arguments));
if (activeCount < global.maxFilesInFlight && pending.length){
console.log("Processing Pending read/write");
pending.shift()();
}
};
};
fs.readFile = function(){
var args = Array.prototype.slice.call(arguments);
if (activeCount < global.maxFilesInFlight){
if (args[1] instanceof Function){
args[1] = wrapCallback(args[1]);
} else if (args[2] instanceof Function) {
args[2] = wrapCallback(args[2]);
}
activeCount++;
origRead.apply(fs,args);
} else {
console.log("Delaying read:",args[0]);
pending.push(function(){
fs.readFile.apply(fs,args);
});
}
};
fs.writeFile = function(){
var args = Array.prototype.slice.call(arguments);
if (activeCount < global.maxFilesInFlight){
if (args[1] instanceof Function){
args[1] = wrapCallback(args[1]);
} else if (args[2] instanceof Function) {
args[2] = wrapCallback(args[2]);
}
activeCount++;
origWrite.apply(fs,args);
} else {
console.log("Delaying write:",args[0]);
pending.push(function(){
fs.writeFile.apply(fs,args);
});
}
};