解压缩会忽略空目录

时间:2019-05-29 00:22:23

标签: javascript node.js unzip

我是日本的Web开发人员。

对不起,我的英语不好。

https://www.npmjs.com/package/unzipper

我正在使用这个库。

这是我的代码。

// unzip module
import fs from 'fs-extra'
import unzipper from 'unzipper'
import Promise from 'bluebird'

export default ({ inputFilePath, outputFilePath }) => {
  return new Promise(async (resolve, reject, onCancel) => {
    try {
      await streamPromise(fs.createReadStream(inputFilePath).pipe(unzipper.Extract({ path: outputFilePath })))
        .then(resolve)
    } catch (error) {
      reject(error)
    }
  })
}

const streamPromise = (stream) => {
  return new Promise((resolve, reject) => {
    stream.on('end', () => {
      resolve('end')
    })
    stream.on('finish', () => {
      resolve('finish')
    })
    stream.on('error', (error) => {
      reject(error)
    })
  })
}

但是其中没有文件的目录将不会被复制。

有什么办法解决这个问题?

1 个答案:

答案 0 :(得分:1)

  • 您要使用unzipper解压缩zip文件。
  • 您还希望导出不包含文件的目录。

如果我的理解是正确的,那么该修改如何?我认为您的情况有几个答案。因此,请仅考虑其中之一。

修改点:

  • 在此修改中,当文件类型为“目录”时,将创建一个新的目录。这样,可以导出没有文件的目录。

修改后的脚本:

请进行如下修改。

// unzip module
import fs from 'fs-extra'
import unzipper from 'unzipper'
import Promise from 'bluebird'
import path from 'path' // Added

// Modified
export default ({ inputFilePath, outputFilePath }) => {
  return new Promise(async (resolve, reject, onCancel) => {
    try {
      await streamPromise(fs.createReadStream(inputFilePath).pipe(unzipper.Parse()), outputFilePath)
        .then(resolve)
    } catch (error) {
      reject(error)
    }
  })
}

// Modified
const streamPromise = (stream, outputFilePath) => {
  return new Promise((resolve, reject) => {
    stream.on("entry", entry => {
      const fileName = entry.path;
      const type = entry.type;
      if (type == "Directory") {
        fs.mkdirSync(path.join(outputFilePath, fileName));
      } else if (type == "File") {
        entry.pipe(fs.createWriteStream(path.join(outputFilePath, fileName)));
      }
    });
    stream.on("end", () => {
      resolve("end");
    });
    stream.on("finish", () => {
      resolve("finish");
    });
    stream.on("error", error => {
      reject(error);
    });
  });
};

参考:

在我的环境中,我可以确认修改后的脚本有效。但抱歉,在您的环境中,该脚本无法正常工作。