Как извлечь все файлы из определенной папки внутри .zip архива и сохранить их на диск в отдельную папку с использованием C#?

Как распаковать содержимое первой папки из архива в папку на диске? Трудно найти информацию по данной процедуре.
  • 4 мая 2024 г. 21:00
Ответы на вопрос 2
Для извлечения файлов из определенной папки внутри .zip архива и сохранения их на диск в отдельную папку с помощью C# можно воспользоваться библиотекой SharpZipLib. Ниже приведен пример кода, который выполняет данную операцию:

```csharp
using System;
using System.IO;
using ICSharpCode.SharpZipLib.Core;
using ICSharpCode.SharpZipLib.Zip;

class Program
{
    static void Main()
    {
        string zipFilePath = "path/to/your/archive.zip";
        string targetFolderPath = "path/to/your/target/folder";

        using (ZipFile zipFile = new ZipFile(zipFilePath))
        {
            foreach (ZipEntry entry in zipFile)
            {
                if (entry.Name.StartsWith("specificFolder/") && !entry.IsDirectory)
                {
                    string entryFileName = Path.GetFileName(entry.Name);
                    string entryFilePath = Path.Combine(targetFolderPath, entryFileName);

                    using (Stream inputStream = zipFile.GetInputStream(entry))
                    using (FileStream outputStream = File.Create(entryFilePath))
                    {
                        StreamUtils.Copy(inputStream, outputStream, new byte[4096]);
                    }
                }
            }
        }
    }
}
```

Данный код открывает .zip архив по указанному пути, итерируется по всем файлам в архиве, и если файл находится в определенной папке ("specificFolder/" в данном случае), то извлекает его и сохраняет в указанную папку на диске.

Чтобы распаковать содержимое первой папки из архива в папку на диске, можно модифицировать код следующим образом:

```csharp
static void Main()
{
    string zipFilePath = "path/to/your/archive.zip";
    string targetFolderPath = "path/to/your/target/folder";

    using (ZipFile zipFile = new ZipFile(zipFilePath))
    {
        foreach (ZipEntry entry in zipFile)
        {
            if (entry.IsDirectory && entry.Name.Split('/').Length == 2)
            {
                string entryFolderPath = Path.Combine(targetFolderPath, entry.Name);
                Directory.CreateDirectory(entryFolderPath);
            }
            else if (!entry.IsDirectory && entry.Name.Split('/').Length == 2)
            {
                string entryFileName = Path.GetFileName(entry.Name);
                string entryFilePath = Path.Combine(targetFolderPath, entryFileName);

                using (Stream inputStream = zipFile.GetInputStream(entry))
                using (FileStream outputStream = File.Create(entryFilePath))
                {
                    StreamUtils.Copy(inputStream, outputStream, new byte[4096]);
                }
            }
        }
    }
}
```

Этот код будет создавать новую папку на диске для первой папки в архиве и извлекать все файлы из нее в эту папку. 
Обратите внимание, что для использования библиотеки SharpZipLib необходимо установить ее с помощью NuGet: `Install-Package SharpZipLib`.
Части кода из одного моего проекта, где решается похожа задача: 

1. Проверить наличие архива:
if (File.Exists(zipPath))
2. Открываем архив:
using (var archive = ZipFile.OpenRead(zipPath))
3. Ищем нужную директорию в архиве:
archive.Entries.FirstOrDefault((e) => e.FullName.StartsWith(folderName + "/") && e.FullName.Length > (folderName.Length + 1))

4. Распаковываем директорию из архива в нужную директорию:
foreach (var entry in archive.Entries.Where(e => e.FullName.StartsWith(folder.FullName)))
{
    string filePath = Path.Combine(destinationPath, entry.FullName.Substring(folderName.Length + 1));
    Directory.CreateDirectory(Path.GetDirectoryName(filePath));
    entry.ExtractToFile(filePath, true);
}
Похожие вопросы