Извлечение папки из архива. C#

Нашёл отличный пример для извлечения файлов - https://docs.microsoft.com/ru-ru/dotnet/standard/io/how-to-compress-and-extract-files (пример 2). Который хорошо работал, до того пока я не попытался извлечь папку из архива.

На этапе извлечении папки ничего не происходит и программа стоит. Что я не так делаю?

ExtrateFile("Bin"); // так пытаюсь извлечь папку их архива

Ответы (1 шт):

Автор решения: S.H.

Похоже, zip так не умеет. Он не умеет распаковывать папки со вложенными объектами. Он оперирует сущностями "entry", то есть "элемент архива".

Распаковка папок - это "сервис, предоставляемый оболочками" этой программы.

Чтобы распаковать папки - нужно сделать это вручную. По приведенной Вами ссылке смотрим пример 2 и немного меняем его, вот так:

(я распаковывал подпапку Xming/locale в папке Xming , там во коду всё вроде видно и комментарии есть)

    using System;
    using System.IO;
    using System.IO.Compression;

    namespace zfolder {
        class Program {
            static void Main(string[] args) {

                string zipPath = @".\result.zip";
                string folder = "Xming/locale";

                Console.WriteLine("Provide path where to extract the zip file:");
                string extractPath = Console.ReadLine();

                // Normalizes the path.
                extractPath = Path.GetFullPath(extractPath);

                using (ZipArchive archive = ZipFile.OpenRead(zipPath)) {
                    foreach (ZipArchiveEntry entry in archive.Entries) {
                        if (entry.FullName.IndexOf(folder)==0 ) { // это означает, что entry начинается с folder. Все case-sensitive!
                            // Gets the full path to ensure that relative segments are removed.
                            
                            string destinationPath = Path.GetFullPath(Path.Combine(extractPath, entry.FullName));
                            if (entry.FullName.Substring(entry.FullName.Length-1, 1)=="/") {
                                // я счиатю это признаком того, что распаковываемое - это директория
                                if (!Directory.Exists(destinationPath))
                                    Directory.CreateDirectory(destinationPath);
                            }
                            else
                                entry.ExtractToFile(destinationPath);
                        }
                    }
                }
            }
        }
    }
→ Ссылка