Часто ви отримуєте архів 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. Крім того, ви можете поділитися своїми запитами з нами через наш форум.

Дивись також