Извлечь ZIP файл программно с помощью библиотеки DotNetZip? - PullRequest
30 голосов
/ 24 февраля 2010

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

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

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

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

Ответы [ 3 ]

38 голосов
/ 24 февраля 2010

Вам нужно проверить каждый 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
21 голосов
/ 25 февраля 2010

В классе 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 килобайтам.

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


критерий (извлеченные файлы)

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

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

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

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

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

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

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


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

13 голосов
/ 26 февраля 2010

Вы также можете использовать 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

...