Подтвердить что ты не робот

Извлечь 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 файл содержит несколько файлов и каталогов. Но я хочу извлечь только некоторые из этих файлов, не все из них.

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

4b9b3361

Ответ 1

Вам нужно протестировать каждый 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

Ответ 2

В классе 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);
}

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

вот несколько примеров критериев


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

name!= *.xls(любой файл с расширением, не являющимся .xls)

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

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

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

attributes!= H (все файлы, чьи атрибуты не содержат Скрытый бит)

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

size > 2gb (все файлы с несжатым размером более 2 гб)


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

Ответ 3

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