unzipper игнорирует пустой каталог - PullRequest
0 голосов
/ 29 мая 2019

Я японский веб-разработчик.

Я не очень хорош в английском, извините.

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 Ответ

1 голос
/ 29 мая 2019
  • Вы хотите распаковать zip-файл, используя unzipper.
  • Вы также хотите экспортировать каталоги без файлов.

Если мое понимание верно, как насчет этой модификации? Я думаю, что есть несколько ответов для вашей ситуации. Поэтому, пожалуйста, подумайте об этом как об одном из них.

Точка модификации:

  • В этой модификации, когда тип файла "Каталог", создается новый Каталог. Таким образом, каталог без файлов можно экспортировать.

Модифицированный скрипт:

Пожалуйста, измените следующим образом.

// 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);
    });
  });
};

Справка:

В моей среде я мог подтвердить, что модифицированный скрипт работает. Но в вашей среде скрипт не работает, я прошу прощения.

...