【问题标题】:unzipper ignores empty directory解压缩器忽略空目录
【发布时间】:2019-10-14 12:52:12
【问题描述】:

我是一名日本 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)
    })
  })
}

但是里面没有文件的目录,不会被复制。

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

【问题讨论】:

    标签: javascript node.js unzip


    【解决方案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);
        });
      });
    };
    

    参考:

    在我的环境中,我可以确认修改后的脚本有效。但是在您的环境中,脚本不起作用,我很抱歉。

    【讨论】:

    • 非常感谢。你是个天才。它也适用于我的环境。
    • @akao 感谢您的回复。很高兴您的问题得到解决。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多