以下のように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% の確率で失敗しました。1つずつダウンロードすると、同じURLのリストが機能しました。
さらにテストしたところ、次のコードであることがわかりました
fs.createWriteStream('anypath');
console.log(fs.exist('anypath'));
console.log(fs.exist('anypath'));
console.log(fs.exist('anypath'));
常に表示されるとは限りませんtrue
が、最初の回答が表示されることがありますfalse
。
非同期fs.createWriteStream
呼び出しが多すぎると、ファイルの作成が保証されないのではないかと思います。これは本当ですか?ファイルの作成を保証する方法はありますか?