Node.js偶尔无法写入文件:错误:ENOENT,打开'文件名'

时间:2014-02-18 02:32:29

标签: javascript node.js

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

我的代码在95%的情况下正常工作,但是,有时候,我收到此错误:“错误:ENOENT,打开'test.Q3rax'”其中test.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;
}

2 个答案:

答案 0 :(得分:3)

当你异步编写时,你可能会遇到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'

答案 1 :(得分:0)

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

https://github.com/71104/rwlock