gpt4 book ai didi

node.js - fs.createWriteStream 不会立即创建文件?

转载 作者:IT老高 更新时间:2023-10-28 21:57:18 25 4
gpt4 key购买 nike

我做了一个简单的从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 调用不能保证文件的创建。这是真的?有什么方法可以保证文件的创建?

最佳答案

在您从流中接收到 'open' 事件之前,您不应在 tempFile 写入流上调用 write。在您看到该事件之前,该文件不会存在。

对于你的功能:

function download(url, tempFilepath, filepath, callback) {
var tempFile = fs.createWriteStream(tempFilepath);
tempFile.on('open', function(fd) {
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);
});
});
});
}

为了你的测试:

var ws = fs.createWriteStream('anypath');
ws.on('open', function(fd) {
console.log(fs.existsSync('anypath'));
console.log(fs.existsSync('anypath'));
console.log(fs.existsSync('anypath'));
});

关于node.js - fs.createWriteStream 不会立即创建文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12906694/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com