Распаковщик игнорирует пустой каталог

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

Я не силен в английском, извините.

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

Но каталог, в котором нет файла, не будет скопирован.

Есть ли способ исправить это?

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
157
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
  • Вы хотите разархивировать 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);
    });
  });
};

Ссылка:

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

Большое спасибо. Ты гений. Это работало и в моем окружении.

Kuru 29.05.2019 06:33

@akao Спасибо за ответ. Я рад, что ваша проблема была решена.

Tanaike 29.05.2019 09:41

Другие вопросы по теме