我制作了一个简单的download from http函数,如下所示(简化时省略了错误处理):
function download(url, tempFilepath, filepath, callback) {
var tempFile = fs.createWriteStream(tempFilepath);
http.request(url, function(res) {
res.on('data', function(chunk) {
tempFile.write(chunk);
}).on('end', function() {
tempFile.end();
fs.renameSync(tempFile.path, filepath);
return callback(filepath);
})
});
}
然而,当我异步调用download()
十次时,它很少在fs.renameSync
上报告错误,并抱怨在tempFile.path
上找不到文件.
Error: ENOENT, no such file or directory 'xxx'
我使用相同的URL列表来测试它,大约30%的时间失败.当一个接一个地下载时,相同的URL列表也起作用.
通过进一步测试,我发现以下代码
fs.createWriteStream('anypath');
console.log(fs.exist('anypath'));
console.log(fs.exist('anypath'));
console.log(fs.exist('anypath'));
并不总是打印true
,但有时第一个答案打印false
.
我怀疑过多的异步fs.createWriteStream
调用不能保证文件的创建.这是真的吗?有什么方法可以保证创建文件吗?