首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在节点10中使用adm-zip/ Unzip /yauzl解压缩失败。

在节点10中使用adm-zip/ Unzip /yauzl解压缩失败。
EN

Stack Overflow用户
提问于 2020-04-27 01:32:48
回答 1查看 978关注 0票数 1

我一直试图在我的代码中添加一个用例,在这个用例中,我试图解压缩一个太大而无法容纳磁盘空间的zip,并且我希望我的代码会抛出ENOSPC。我尝试过多个库,但是没有一个库没有抛出错误,而是在没有完成压缩的情况下默默地失败。我希望他们会抛出ENOSPC错误,但是所有的包似乎都记录了第一个info语句,它声明解压缩已经启动,但之后什么也没有。他们中的大多数都会创建不完整的文件夹,不管他们能在磁盘空间耗尽之前写什么。下面是我的代码在每个库中的样子。

我的代码使用adm-zip

代码语言:javascript
复制
exports.unzip = function(source, destination) {
    console.info("Started un-zipping from source: %s to destination: %s", source, destination);
    try {
        const zip = new AdmZip(source);
        zip.extractAllTo(destination, true);
        console.info("done unzipping");
    } catch (error) {
        console.error("Unzipping failed. Reason: %s", error)
        throw new Error(error)
    }
};

使用约兹尔的代码

代码语言:javascript
复制
exports.extractZip = function(source, destination) {
    return new Promise(function(resolve, reject) {
      console.log("Extracting zip: '" + source + "' to '" + destination + "'");

      yauzl.open(source, {
        lazyEntries: true
      }, function(err, zipfile) {
        if (err) throw err;
        zipfile.readEntry();
        zipfile.on("error", function (err) {
            console.error("Something went wrong while extracting!");
            reject(new Error(err));
        });
        zipfile.on("end", function () {
            console.log("Completed extracting zip!");
            resolve();
        });
        zipfile.on("entry", function(entry) {
          if (/\/$/.test(entry.fileName)) {
            // directory file names end with '/'
            mkdirp(destination + '/' + entry.fileName, function(err) {
              if (err) {
                  console.error("Something went wrong while extracting!");
                  throw err;
              }
              zipfile.readEntry();
            });
          } else {
            // file entry
            zipfile.openReadStream(entry, function(err, readStream) {
              if (err) {
                console.error("Something went wrong while extracting!");
                throw err;
              }
              // ensure parent directory exists
              mkdirp(destination + '/' + path.dirname(entry.fileName), function(err) {
                if (err) throw err;
                readStream.pipe(fs.createWriteStream(destination + '/' + entry.fileName));
                readStream.on("end", function() {
                  zipfile.readEntry();
                });
              });
            });
          }
        });
      });
    });
  }

使用解拉链的代码

代码语言:javascript
复制
exports.unzip2 = function(source, destination) {
    console.info("Started un-zipping from source: %s to destination: %s", source, destination);
    try {
        fs.createReadStream(source)
        .pipe(unzipper.Extract({ path: destination }))
        .on('error',function (err){
            console.error("something went wrong", err.code);
            throw err;
        });
    } catch (error) {
        console.error("Unzipping failed. Reason: %s", error)
        throw new Error(error)
    }
};

使用萃取-拉链的代码

代码语言:javascript
复制
exports.extractArchive = async function(source, destination) {
    try {
        extract(source, { dir: destination }, function (err) {
            if (err) {
                console.error("Something went wrong!", err.code);
                throw err;
            }
        });
        console.log('Extraction complete')
      } catch (err) {
        // handle any errors
      }
};

我的密码有什么问题吗?有什么特别的活动需要我去听吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-28 16:53:42

在对Yauzl和unzipper进行了一些跟踪和错误处理之后,解拉器似乎可以使用以下代码(解压缩过程中磁盘空间不足时抛出ENOSPC )。

代码语言:javascript
复制
exports.unzip2 = function(source, destination) {
    return new Promise(function(resolve, reject) {
        console.info("Started un-zipping from source: %s to destination: %s", source, destination);
        try {
            var sourceStream = fs.createReadStream(source);
            sourceStream.on('error',function (err){
                console.error("something went wrong", err.code);
                reject(new Error(err));
            });
            var destinationStream = unzipper.Extract({ path: destination });
            destinationStream.on('error',function (err){
                console.error("something went wrong", err.code);
                reject(new Error(err));
            });
            destinationStream.on('close',function (){
                console.log("Completed extract!");
                resolve();
            });
            sourceStream.pipe(destinationStream).on('error',function (err){
                console.error("something went wrong", err.code);
                reject(new Error(err));
            });;
        } catch (error) {
            console.error("something went wrong", err.code);
            reject(new Error(err));
        }
    });
};
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61450393

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档