Задать вопрос
Stealch
@Stealch
Админ, мотобродяга.

C# Как распаковать все содержимое конкретной папки в .zip архиве в папку на диске?

Имеется архив, корне архива папка, в папке папки и файлы. Требуется распаковать содержимое первой папки в папку на диске. Нигде не могу найти даже намека... Грубо говоря надо распаковать archive.zip\folder\*.* куда-нибудь.
  • Вопрос задан
  • 192 просмотра
Подписаться 1 Простой 2 комментария
Решения вопроса 1
Mike_Ro
@Mike_Ro
Python, JS, WordPress, SEO, Bots, Adversting
Часть кода из одного моего проекта, где решается похожа задача (поправить пути и логику при необходимости):
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);
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы