2015-12-24 74 views
0

我想附加行到nodejs中的文件。我寫了下面的代碼。Nodejs - fs.appendFileSync拋出錯誤EBUSY

/* Name : test.js */ 
/* globals require,__dirname */ 
var fs = require("fs"); 
for (var i = 0; i < 100000; i++) { 
    fs.appendFileSync(__dirname+'/out.txt', "line " + i + "\n"); 
} 

但是,當我運行這個程序,我得到以下錯誤。

$ node test.js 
fs.js:584 
    return binding.open(pathModule._makeLong(path), stringToFlags(flags), mode); 
               ^

Error: EBUSY: resource busy or locked, open 'd:\<redacted>\out.txt' 
    at Error (native) 
    at Object.fs.openSync (fs.js:584:18) 
    at Object.fs.writeFileSync (fs.js:1224:33) 
    at Object.fs.appendFileSync (fs.js:1283:6) 
    at Object.<anonymous> (d:\<redacted>\test.js:3:8) 
    at Module._compile (module.js:425:26) 
    at Object.Module._extensions..js (module.js:432:10) 
    at Module.load (module.js:356:32) 
    at Function.Module._load (module.js:313:12) 
    at Function.Module.runMain (module.js:457:10) 

我已經搜索,但找不到任何理由或解決方案。有人可以解釋爲什麼會發生此錯誤,以及如何解決它?

當我嘗試下面的方法時,它可以工作,但這對於我試圖解決的問題來說並不是非常可行。

/* globals require,__dirname */ 
var fs = require("fs"); 
var buffer = ""; 

for (var i = 0; i < 100000; i += 1) { 
    var line = 'line ' + i + '\n'; 
    buffer += line;     // keep the line in buffer  
} 

fs.appendFileSync(__dirname+'/out.txt', buffer); // now write the buffer 

在此先感謝。

+0

我認爲這種情況發生因爲您嘗試在很短的時間內訪問您的文件很多次。 你試圖解決什麼問題? – Lauromine

+0

@Lauromine是的,這可能是原因,但不應該'fs.appendFileSync'處理這個?我想解決的問題是,我必須編寫一個程序,它將讀取一個包含> 200萬條記錄的JSON數據集,並根據記錄將其分成3個文件。 –

+0

我剛剛發現http://stackoverflow.com/questions/10747347/node-js-and-file-system-on-windows-ebusy-error也許它會幫助你。 – Lauromine

回答

2

你的代碼適用於我,但它非常慢,需要幾分鐘才能完成寫入文件(準確地說是269621.425ms)。你的問題很可能是因爲在很短的時間內訪問了很多,我猜這對我很有用,因爲我使用的是SSD。

對於您的問題,streams可能會非常有幫助。它的速度和內存效率都很高(您不必存儲巨大的緩衝區變量)。我不知道你想要做的正是這樣這裏就是你們的榜樣使用流寫了什麼(我用event-stream爲了方便):

var fs = require('fs'); 
var es = require('event-stream'); 

console.time('done in'); 
es.readable(function (count, next) { 
    for (var i = 0; i < 100000; i++) { 
     this.emit('data', 'line ' + i + "\n"); 
    } 
    this.emit('end'); 
    console.timeEnd('done in'); 
    next(); 
}).pipe(fs.createWriteStream('out.txt')); 

中完成的:90.561ms

+1

謝謝,這是一個不錯的解決方案。 「流」的使用從來沒有出現在我腦海。 –