Node.js偶尔无法写入文件,出现以下错误:ENOENT,打开'filename'



我正在开发一个访问文件系统的节点.js应用程序。在我的测试中,我注意到一些非常奇怪的事情,谷歌无法为我回答。

我的代码在 95% 的时间内都能正常工作,但是,有时我会收到此错误:"错误:ENOENT,打开'测试。Q3rax'"在哪里测试。Q3rax 是一个随机生成的文件名。该文件应该是可写的,如果我再次运行我的代码,文件名硬编码,它就可以正常工作。

以下是失败的代码:

npJSON.prototype._writeFile = function(newData) {
    if (!this.loaded)
        throw "ERROR: npJSON._writeFile() was called before any data was loaded.";
    var stringToWrite = JSON.stringify(newData);
    fs.writeFile(this.fileName,stringToWrite, function(err) {
        if (err)
            throw err;
    });
};

编辑:为澄清起见,这就是我生成随机文件名的方式:

var filename = 'test.' + getRandomText(5,6);
function getRandomText(numberOfCharactersLow, numberOfCharactersHigh) {
    var numbChar = getRandomInt(numberOfCharactersLow, numberOfCharactersHigh);
    var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890";
    var returnText = '';
    for (var i = 0; i < numbChar; i++) {
        returnText += possible.charAt(getRandomInt(0, 62));
    }
    return returnText;
}
function getRandomInt(min, max) {
    return Math.floor(Math.random() * (max - min + 1)) + min;
}

您可能会遇到这样一个事实,即 Node 中的文件在异步写入时不会使用 O_SYNC 写入。这意味着您可能在内核将文件刷新到磁盘之前尝试访问该文件。这里有更多的阅读(在标题fs.writeFile()下):http://www.daveeddy.com/2013/03/26/synchronous-file-io-in-nodejs/

编辑:这是一个有力地演示问题的示例:

var fs = require('fs');
var fname = '/tmp/fs.' + process.pid + '.tmp';
var buf = new Buffer(1024);
buf.fill('a');
fs.writeFile(fname, buf, function(err) {
  console.log(err);
});
try {
  fs.readFileSync(fname);
} catch(e) {
  console.log(e.stack);
}
process.on('exit', function() {
  try { fs.unlinkSync(fname); } catch(e) {}
});
// Output:
// Error: ENOENT, no such file or directory '/tmp/fs.31281.tmp'

我的猜测是,您有多个流同时访问该文件。 我会看看锁定:

https://github.com/71104/rwlock

最新更新