Javascript Nodejs-fs.appendFileSync抛出错误EBUSY

Javascript Nodejs-fs.appendFileSync抛出错误EBUSY,javascript,node.js,fs,Javascript,Node.js,Fs,我试图在nodejs中向文件追加行。我已经编写了以下代码 /* 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"); } /*名称:test.js*/ /*全局变量需要,_udirname*/ v

我试图在nodejs中向文件追加行。我已经编写了以下代码

/* 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");
}
/*名称:test.js*/
/*全局变量需要,_udirname*/
var fs=要求(“fs”);
对于(变量i=0;i<100000;i++){
fs.appendFileSync(uu 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)
$node test.js
财政司司长:584
返回binding.open(pathModule.\u makeLong(path)、stringToFlags(flags)、mode);
^
错误:EBUSY:资源正忙或已锁定,打开'd:\\out.txt'
错误(本机)
在Object.fs.openSync(fs.js:584:18)
在Object.fs.writeFileSync(fs.js:1224:33)
在Object.fs.appendFileSync(fs.js:1283:6)
反对。(d:\\test.js:3:8)
在模块处编译(Module.js:425:26)
在Object.Module.\u extensions..js(Module.js:432:10)
在Module.load(Module.js:356:32)
在Function.Module.\u加载(Module.js:313:12)
位于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
/*globals需要,\uuu dirname*/
var fs=要求(“fs”);
var buffer=“”;
对于(变量i=0;i<100000;i+=1){
变量行='行'+i+'\n';
buffer+=line;//将该行保留在缓冲区中
}
fs.appendFileSync(uu dirname+'/out.txt',buffer);//现在写缓冲区

提前谢谢

您的代码对我来说很有效,但速度非常慢,在文件中完成写入需要几分钟(确切地说是269621.425ms)。你的问题很可能是因为在很短的时间内有这么多的访问,我想这对我来说是可行的,因为我使用的是SSD

对于您的问题,可能非常有帮助。它速度快,内存效率高(不必存储巨大的缓冲区变量)。我不知道您到底想做什么,所以下面是您使用streams编写的示例(我使用streams是为了方便):

var fs=require('fs');
var es=需要(‘事件流’);
控制台。时间(“完成”);
易读(函数(计数,下一步){
对于(变量i=0;i<100000;i++){
this.emit('data','line'+i+“\n”);
}
这个.emit('end');
console.timeEnd('done in');
next();
}).pipe(fs.createWriteStream('out.txt');
完成时间:90.561ms


我认为这是因为您在很短的时间内多次尝试访问您的文件。您试图解决的“问题”是什么?@Lauromine是的,这可能是原因,但不应该
fs.appendFileSync
处理这个问题?我试图解决的问题是,我必须编写一个程序来读取超过200万条记录的JSON数据集,并根据记录将其拆分为3个文件。我刚刚发现它可能会对您有所帮助。@Lauromine我之前看到过,但在这种情况下,该程序试图访问一个特殊的系统文件。顺便说一句,谢谢你的快速回复。谢谢,这是一个很好的解决方案。我从来没有想到过使用
streams
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'));