Извлечь zip-файл программно библиотекой DotNetZip?

У меня есть функция, которые получают zip-файл и извлекают его к каталогу (я пользуюсь библиотекой DotNetZip.)

public void ExtractFileToDirectory(string zipFileName, string outputDirectory)
{
     ZipFile zip = ZipFile.Read(zipFileName);
     Directory.CreateDirectory(outputDirectory);
     zip.ExtractAll(outputDirectory,ExtractExistingFileAction.OverwriteSilently);
}

Мой zip-файл содержит несколько файлов и каталогов. Но я хочу извлечь только некоторые из этих файлов, не всех их.

Как я могу сделать эту работу?

32
задан Cheeso 10 March 2010 в 02:28
поделиться

3 ответа

Вам необходимо протестировать каждый ZipEntry , чтобы узнать, хотите ли вы его извлечь:

public void ExtractFileToDirectory(string zipFileName, string outputDirectory)
{
     ZipFile zip = ZipFile.Read(zipFileName);
     Directory.CreateDirectory(outputDirectory);
      foreach (ZipEntry e in zip)
      {
        // check if you want to extract e or not
        if(e.FileName == "TheFileToExtract") 
          e.Extract(outputDirectory, ExtractExistingFileAction.OverwriteSilently);
      }
}

.

ZipFile zip = ZipFile.Read(zipFileName); //Runs in framework 4.5
39
ответ дан 27 November 2019 в 20:17
поделиться

В классе ZipFile есть метод ExtractSelectedEntries. вот подпись метода.

public void ExtractSelectedEntries(string selectionCriteria, string directoryPathInArchive, string extractDirectory, ExtractExistingFileAction extractExistingFile)

Таким образом, в вашей программе вы можете просто извлечь указанные файлы, указав selectionCriteria.

public void ExtractFileToDirectory(string zipFileName, string outputDirectory)
{
     ZipFile zip = ZipFile.Read(zipFileName);
     Directory.CreateDirectory(outputDirectory);
     zip.ExtractSelectedEntries("name = *.doc", "document\", outputDirectory, ExtractExistingFileAction.OverwriteSilently);
}

Вы можете комбинировать критерии с помощью союзов И или ИЛИ. Использование строки вида «name = * .txt AND size> = 100k» для selectionCriteria извлекает записи, имена которых заканчиваются на .txt, а несжатый размер которых больше или равен 100 килобайтам.

вот некоторые примеры критериев


критерии (файлы получены)

имя! = * .Xls (любой файл с расширением, отличным от .xls)

имя = * .mp3 (любой файл с расширением .mp3)

*. mp3 (то же, что и выше, любой файл с расширением .mp3)

атрибуты = A (все файлы, атрибуты которых включают бит архива)

атрибуты! = H (все файлы, чьи атрибуты не включают скрытый бит)

mtime> 2009-01-01 (все файлы с временем последнего изменения после 1 января 2009 г.)

размер> 2 ГБ (все файлы, размер несжатого файла которых превышает 2 ГБ)


Для получения дополнительной информации вы должны прочитать документ API наедине с библиотекой.

21
ответ дан 27 November 2019 в 20:17
поделиться

Вы также можете использовать LINQ, чтобы выбрать, какие записи вы хотите извлечь. Например:

using (var zip = ZipFile.Read(ArchiveToRead))
{
    var selection = from e in zip.Entries
        where System.IO.Path.GetFileName(e.FileName).StartsWith("C")
        select e;

    foreach (var e in selection)
        e.Extract(extractDir);
}

Конечно, вы можете использовать любые критерии запроса в предложении where .

14
ответ дан 27 November 2019 в 20:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: