javascript - Nodejs - fs.appendFileSync 抛出错误 EBUSY

标签 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");
}

但是当我运行这个程序时,我收到以下错误。

$ 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

提前致谢。

最佳答案

你的代码对我有用,但速度非常慢,需要几分钟才能完成文件写入(准确地说是 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'));

done in: 90.561ms

关于javascript - Nodejs - fs.appendFileSync 抛出错误 EBUSY,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34454702/

相关文章:

javascript - 滚动到多个 anchor

javascript - 选择类中由 <br> 分隔的一系列字符串

javascript - 将新对象添加到数组

node.js - Axios - 如何修复 - POST URL net::ERR_CONNECTION_RESET

javascript - 如何设置从对 .js 或 json 文件的响应中收到的值

javascript - 如何使用 JavaScript 显示值?

sql-server - 使用 Sequelize 将对象传递到钩子(Hook)中

node.js - Electron : please install sqlite3 package manually

javascript - Polymer 和外部 Node.js 库

node.js - 使用 Electron 在 Angular 2 应用程序中访问文件系统