Часто ви отримуєте архів ZIP, який містить інші архіви ZIP, утворюючи вкладену структуру архівів. У таких випадках ви можете отримати плоску структуру, розпакувавши всі внутрішні архіви ZIP у зовнішній архів. Щоб виконати цю операцію програмним шляхом, у цій статті показано, як створити плоский ZIP-архів у C#.
C# .NET API для створення плоских архівів ZIP
Щоб створити плоскі ZIP-архіви, ми використаємо Aspose.ZIP for .NET. Це API архівування, призначений для створення та розпакування популярних форматів архівів, зокрема ZIP, TAR, GZip і 7z. Ви можете встановити API з NuGet або завантажити його DLL із розділу завантажень.
PM> Install-Package Aspose.Zip
Створення плоского ZIP-архіву на C#
Щоб зрозуміти структуру плоского ZIP-архіву, розглянемо приклад. Нижче наведено архів ZIP, який містить інший архів ZIP.
parent.zip
├first.txt
├inner.zip
│ ├game.exe
│ └subitem.bin
└picture.gif
Після перетворення цього ZIP-архіву на плоский ZIP усі записи внутрішнього ZIP-архіву буде розпаковано до батьківського ZIP-архіву. Нарешті ми отримаємо таку структуру батьківського ZIP-архіву.
flatten.zip
├first.txt
├picture.gif
├game.exe
└subitem.bin
Давайте подивимося, як виконати цю трансформацію програмно. Нижче наведено кроки для створення плоского архіву ZIP у C#.
- Спочатку завантажте батьківський ZIP-архів за допомогою класу Archive.
- Потім створіть списки для зберігання внутрішніх записів ZIP для видалення з батьківського ZIP, витягнутих записів та їхніх імен.
- Після цього перегляньте кожен ArchiveEntry у батьківському архіві ZIP за допомогою колекції Archive.Entries.
- Для кожного запису виконайте такі дії:
- Перевірте, чи запис є ZIP-архівом, використовуючи метод ArchiveEntry.Name.EndsWith(".zip", StringComparison.InvariantCultureIgnoreCase)).
- Потім додайте запис до списку записів, які потрібно видалити.
- Відкрийте запис в об’єкті MemoryStream за допомогою методу ArchiveEntry.Open().CopyTo(MemoryStream).
- Перегляньте записи внутрішнього ZIP-архіву та в кожній ітерації виконайте наступні кроки.
- Додайте назву запису до списку записів, які потрібно додати.
- Потім завантажте запис у MemoryStream за допомогою методу ArchiveEntry.Open().CopyTo(MemoryStream).
- Нарешті, додайте запис до списку записів, які потрібно додати до батьківського ZIP.
- Потім перегляньте список внутрішніх ZIP-архівів і видаліть кожен запис за допомогою методу Archive.DeleteEntry(ArchiveEntry).
- Перегляньте список записів, які потрібно додати до батьківського ZIP, і додайте кожен запис за допомогою методу Archive.CreateEntry(String, Stream).
- Нарешті, збережіть батьківський ZIP-архів за допомогою методу Archive.Save(String).
У наведеному нижче прикладі коду показано, як створити плоский ZIP-архів у C#.
// Завантажити ZIP-архів
using (Archive outer = new Archive("Archives/nested-archive.zip"))
{
// Створіть список для видалення внутрішніх записів ZIP після вилучення
List<ArchiveEntry> entriesToDelete = new List<ArchiveEntry>();
// Створіть список, щоб додати імена файлів у внутрішніх ZIP-архівах
List<string> namesToInsert = new List<string>();
// Створіть список, щоб додати об’єкти потоку файлів у внутрішніх ZIP-архівах
List<MemoryStream> contentToInsert = new List<MemoryStream>();
// Переглядайте записи в батьківському архіві ZIP
foreach (ArchiveEntry entry in outer.Entries)
{
// Перевірте, чи запис є файлом ZIP
if (entry.Name.EndsWith(".zip", StringComparison.InvariantCultureIgnoreCase))
{
// Додайте запис до списку, щоб зберегти посилання, щоб пізніше видалити його з архіву
entriesToDelete.Add(entry);
// Створіть об’єкт потоку, щоб відкрити ZIP-архів
MemoryStream innerCompressed = new MemoryStream();
entry.Open().CopyTo(innerCompressed);
// Завантажте ZIP-архів із потокового об’єкта
using (Archive inner = new Archive(innerCompressed))
{
// Переглядати записи архіву
foreach (ArchiveEntry ie in inner.Entries)
{
// Збережіть назву запису в списку
namesToInsert.Add(ie.Name);
// Розпакуйте запис архіву в об’єкт потоку
MemoryStream content = new MemoryStream();
ie.Open().CopyTo(content);
// Додати запис до списку
contentToInsert.Add(content);
}
}
}
}
// Видаліть внутрішні архіви ZIP
foreach (ArchiveEntry e in entriesToDelete)
outer.DeleteEntry(e);
// Вставте файли внутрішніх ZIP-архівів у батьківський ZIP-архів
for (int i = 0; i < namesToInsert.Count; i++)
outer.CreateEntry(namesToInsert[i], contentToInsert[i]);
outer.Save("Archives/flatten.zip");
}
Отримайте безкоштовну ліцензію API
Ви можете отримати безкоштовну тимчасову ліцензію на використання Aspose.ZIP for .NET без обмежень щодо оцінювання.
Висновок
У цій статті ви дізналися, як програмно створити плоский ZIP-архів у C#. Зокрема, ми продемонстрували, як створити плоский ZIP, розпакувавши внутрішні архіви ZIP у батьківський ZIP. Крім того, ви можете відвідати документацію, щоб дізнатися більше про Aspose.ZIP for .NET. Крім того, ви можете поділитися своїми запитами з нами через наш форум.