Ознакомьтесь с классом ZipArchive , который, я думаю, имеет функции, необходимые для декомпрессии zip-файлов в памяти.
Предполагается, что у вас есть массив байтов (byte []
), которые представляют ZIP-файл в памяти, вы должны создать экземпляр объекта ZipArchive, который будет использоваться для чтения этого массива байтов и интерпретировать их как ZIP-файл, который вы хотите загрузить.Если вы проверите в документации доступные конструкторы класса ZipArchive в документации, вы увидите, что им требуется объект потока, из которого будут считываться данные.Итак, первым шагом будет преобразование массива byte []
в поток, который может быть прочитан конструкторами, и вы можете сделать это, используя объект MemoryStream .
Вот пример того, как перечислить все записи внутри ZIP-архива, представленные в памяти в виде байтового массива:
byte [] zipArchiveBytes = ...; // Read the ZIP file in memory as an array of bytes
using (var inputStream = new MemoryStream(fileBytes))
using (var zipArchive = new ZipArchive(inputStream, ZipArchiveMode.Read))
{
Console.WriteLine("Listing archive entries...");
foreach (var archiveEntry in zipArchive.Entries)
Console.WriteLine($" {archiveEntry.FullName}");
}
Каждый файл в ZIP-архиве будет представлен как ZipArchiveEntry экземпляр.Этот класс предлагает свойства, которые позволяют вам получать информацию, такую как исходная длина файла из архива ZIP, его сжатая длина, его имя и т. Д.
Для того, чтобы прочитать конкретный файл, который содержится внутриZIP-файл, вы можете использовать ZipArchiveEntry.Open () .Следующий пример иллюстрирует, как открыть определенный файл из архива, если у вас есть FullName внутри ZIP-архива:
ZipArchiveEntry archEntry = zipArchive.GetEntry("my-folder-inside-zip/dog-picture.jpg");
byte[] readResult;
using (Stream entryReadStream = archEntry.Open())
{
using (var tempMemStream = new MemoryStream())
{
entryReadStream.CopyTo(tempMemStream);
readResult = tempMemStream.ToArray();
}
}
В этом примере считывается заданное содержимое файла и возвращается какмассив байтов (хранится в переменной byte[] readResult
), который затем можно использовать в соответствии с вашими потребностями.