当前位置: 首页 > 知识库问答 >
问题:

财政司司长。createWriteStream是否不立即创建文件?

澹台星剑
2023-03-14

我从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调用无法保证文件创建。这是真的吗?有什么方法可以保证创建文件吗?

共有3个答案

蔡鹏程
2023-03-14

以下是我用来完成它的:

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);
        });
    })
};
郝昊天
2023-03-14

接受的答案没有为我下载最后的一些字节。
这是一个正常工作的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

融伯寅
2023-03-14

在从流中收到'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。 第二阶段的业务。 进行公司注册手续。 持有个人资产负债。 有限责任。 成立过程的结果。 应遵循法律程序。 不要为公司筹集资金。 充当集资渠道。 与日常业务活动有关。 维护所有