Как создать структурированный ZIP-архив в памяти из файлов в C#? - PullRequest
1 голос
/ 13 января 2020

У меня есть ряд файлов, принадлежащих к некоторой логической категории, скажем, «Category_A», и ряд других файлов, принадлежащих к другой логической категории («Category_B»). Я хотел бы создать объект ZIP в памяти (MemoryStream, или байтовый массив, или что-то еще), чтобы результирующая структура объекта ZIP отражала следующую схему:

ZIP
 +-Category_A
 |    +FileA1
 |    +FileA2
 |      ...
 +-Category_B
      +FileB1
      +FileB2
       ...

Каталоги "Category_A" и «Category_B» не существует в исходной файловой системе, и файлы поступают из разных мест.

Есть ли возможность достичь этого с какой-либо библиотекой? (Мой проект в. Net 4.0, обновление не вариант). Я пытался использовать IonicZip Zip File и GZipStream, но не нашел решения.

1 Ответ

1 голос
/ 14 января 2020

Спасибо всем. А пока я сам нашел ответ (как обычно, методом проб и ошибок). Используя библиотеку Ioni c Zip, вы делаете примерно так:

ZipFile zip = new ZipFile();

// below are the files of "Category_A" converted to byte arrays: 
byte[] fileA1   = ...;
byte[] fileA2   = ...;

// the byte arrays will be added to the archive with paths "Category_A\\fileA1" 
// and "Category_A\\fileA2" respectively. 
// The level "Category_A" within the archive is created automatically.
zip.AddEntry("Category_A\\fileA1", fileA1);
zip.AddEntry("Category_A\\fileA2", fileA2);

// The same for "Category_B" and its files:
byte[] fileB1   = ...;
byte[] fileB2   = ...;

zip.AddEntry("Category_B\\fileB1", fileB1);
zip.AddEntry("Category_B\\fileB2", fileB2);

// save the result.
zip.Save("test.zip");

Моя ошибка при попытке ранее заключалась в том, что я сначала создал ZipEntries для категорий, а затем дополнительно для их файлов, что неправильно, так как пустой ZipEntry Затем создается с именем категории.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...