我从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上报告错误。重命名同步程序
在tempFile中找不到文件。路径
。
Error: ENOENT, no such file or directory 'xxx'
我使用相同的网址列表来测试它,它失败了大约30%的时间。当一个接一个地下载时,相同的网址列表起作用。
再测试一些,我发现下面的代码
fs.createWriteStream('anypath');
console.log(fs.exist('anypath'));
console.log(fs.exist('anypath'));
console.log(fs.exist('anypath'));
并不总是打印true
,但有时第一个答案会打印false
。
我怀疑有太多的异步fs。createWriteStream
调用无法保证文件创建。这是真的吗?有什么方法可以保证创建文件吗?
以下是我用来完成它的:
function download(url, dest) {
return new Promise((resolve, reject) => {
http.get(url, (res) => {
if (res.statusCode !== 200) {
var err = new Error('File couldn\'t be retrieved');
err.status = res.statusCode;
return reject(err);
}
var chunks = [];
res.setEncoding('binary');
res.on('data', (chunk) => {
chunks += chunk;
}).on('end', () => {
var stream = fs.createWriteStream(dest);
stream.write(chunks, 'binary');
stream.on('finish', () => {
resolve('File Saved !');
});
res.pipe(stream);
})
}).on('error', (e) => {
console.log("Error: " + e);
reject(e.message);
});
})
};
接受的答案没有为我下载最后的一些字节。
这是一个正常工作的Q版本(但是没有临时文件)。
'use strict';
var fs = require('fs'),
http = require('http'),
path = require('path'),
Q = require('q');
function download(url, filepath) {
var fileStream = fs.createWriteStream(filepath),
deferred = Q.defer();
fileStream.on('open', function () {
http.get(url, function (res) {
res.on('error', function (err) {
deferred.reject(err);
});
res.pipe(fileStream);
});
}).on('error', function (err) {
deferred.reject(err);
}).on('finish', function () {
deferred.resolve(filepath);
});
return deferred.promise;
}
module.exports = {
'download': download
};
注意,我在文件流上收听的是finish
,而不是在响应时收听的end
。
在从流中收到'open'
事件之前,您不应该在temFile
写入流中调用写
。该文件将不存在,直到您看到该事件。
对于您的功能:
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'));
});
问题内容: 我 从http 函数进行了如下简单 下载 (为简化起见,省略了错误处理): 但是,由于我异步调用了数十次,因此很少有人报告错误,因为抱怨无法在找到文件。 我使用了相同的URL列表进行测试,但失败了大约30%。一次下载一个相同的URL列表。 测试了一下,我发现下面的代码 并非总是打印,但有时第一个答案打印。 我怀疑太多的异步调用不能保证文件的创建。这是真的?有什么方法可以保证文件创建?
(面着玩玩,过了,但没去) (没问八股,基本场景题和之前两家公司实习工作内容和代码能力) 主要是前大二和大三前两家公司工作内容,项目技术。 nacos 配置中心和yml springboot Condition 如何实现对象的自动配置条件。 自己手写哪些sdk jdk8:Stream流,lamda 工具包依赖:jackson,fastjson,hutool,easyExcel,
内容营销是ToB企业营销的常见营销手段,以行业白皮书、解决方案、营销内容、产品电子彩页等内容吸引客户注册留资或对存量客户\潜在客户进行培育孵化; 市场人员可在公司文件管理市场内容营销资料; 1. 添加文件 访问【内容中心】- 【公司推广】,点击【添加文件】可选择从本地上传或从公司网盘中选择有权限访问的文件资料; 文件大小格式要求: 上传的文件大小不能大于100M; 支持 pdf、.ppt、.ppt
我能在flutter中创建一些类似于吐司的东西吗? 只是一个微小的通知窗口,不直接面对用户,不锁定或淡化后面的视图。
Support for the Oracle database. The following table summarizes current support levels for database release versions. 支持的Oracle版本 The following dialect/DBAPI options are available. Please refer to ind
本文向大家介绍比较公司和公司。,包括了比较公司和公司。的使用技巧和注意事项,需要的朋友参考一下 公司与公司之间的主要区别如下- 公司 成立公司 这是经营业务的实体。 注册为公司的第一步。 它被称为CORP。 它被称为INC。 第二阶段的业务。 进行公司注册手续。 持有个人资产负债。 有限责任。 成立过程的结果。 应遵循法律程序。 不要为公司筹集资金。 充当集资渠道。 与日常业务活动有关。 维护所有