У меня есть функция, которые получают zip-файл и извлекают его к каталогу (я пользуюсь библиотекой DotNetZip.)
public void ExtractFileToDirectory(string zipFileName, string outputDirectory)
{
ZipFile zip = ZipFile.Read(zipFileName);
Directory.CreateDirectory(outputDirectory);
zip.ExtractAll(outputDirectory,ExtractExistingFileAction.OverwriteSilently);
}
Мой zip-файл содержит несколько файлов и каталогов. Но я хочу извлечь только некоторые из этих файлов, не всех их.
Как я могу сделать эту работу?
Вам необходимо протестировать каждый 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
В классе 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 наедине с библиотекой.
Вы также можете использовать 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
.