Часть кода из одного моего проекта, где решается похожа задача (поправить пути и логику при необходимости):
using System.IO.Compression;
string zipPath = @"path/zip.zip";
string unZipPath = @"path/unzip-dir";
string dirNameInZip = "dir-name";
// Проверяем наличие архива
if (!File.Exists(zipPath))
{
throw new FileNotFoundException("Ошибка, архив не найден.", zipPath);
}
// Создаем выходную директорию, если она не существует
Directory.CreateDirectory(unZipPath);
// Получаем архив
using var archive = ZipFile.OpenRead(zipPath);
// Ищем нужную директорию в архиве
var folder = archive.Entries.FirstOrDefault((e) =>
e.FullName.StartsWith(dirNameInZip + "/") && e.FullName.Length > dirNameInZip.Length + 1);
if (folder == null)
{
throw new DirectoryNotFoundException($"Ошибка, директория '{dirNameInZip}' в архиве не найдена.");
}
// Извлекаем директорию со всеми данными
foreach (var entry in archive.Entries.Where((e) => e.FullName.StartsWith(folder.FullName)))
{
string relativePath = entry.FullName[(folder.FullName.Length + 1)..];
string filePath = Path.Combine(unZipPath, relativePath);
// Создание вложенных директорий, если требуется
string? directoryPath = Path.GetDirectoryName(filePath);
if (!string.IsNullOrEmpty(directoryPath))
{
Directory.CreateDirectory(directoryPath);
}
// Извлечение файлов с перезаписью
entry.ExtractToFile(filePath, overwrite: true);
}