Извлечение папки из архива. C#
Нашёл отличный пример для извлечения файлов - https://docs.microsoft.com/ru-ru/dotnet/standard/io/how-to-compress-and-extract-files (пример 2). Который хорошо работал, до того пока я не попытался извлечь папку из архива.
На этапе извлечении папки ничего не происходит и программа стоит. Что я не так делаю?
ExtrateFile("Bin"); // так пытаюсь извлечь папку их архива
Ответы (1 шт):
Похоже, 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);
}
}
}
}
}
}