我正在开发一个访问文件系统的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;
}
答案 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)
我的猜测是您有多个流同时访问该文件。我会看看锁定: