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