Create Flat ZIP Archive in C#

When working with ZIP archives, you may encounter a scenario where a ZIP file contains other ZIP files, creating a nested structure. If you want to streamline this by extracting all inner ZIP archives into the outer archive, you’re in the right place. In this article, we will explore how to create a flat ZIP archive in C# using the powerful Aspose.ZIP for .NET.

Table of Contents

Overview of the .NET API to Create Flat ZIP Archives

To create flat ZIP archives, we will utilize the Aspose.ZIP for .NET library. This robust archiving API allows you to create and extract various archive formats, including ZIP, TAR, GZip, and 7z. You can easily install this library from NuGet or download its DLL from the downloads section.

PM> Install-Package Aspose.Zip

Steps to Create a Flat ZIP Archive in C#

To better understand the structure of a flat ZIP archive, consider the following example. Initially, we have a ZIP archive containing another ZIP archive:

parent.zip
 ├ first.txt
 ├ inner.zip
 │ ├ game.exe
 │ └ subitem.bin
 └ picture.gif

After transforming this ZIP archive into a flat structure, all entries from the inner ZIP will be extracted into the parent ZIP, leading to the following structure:

flatten.zip
 ├ first.txt
 ├ picture.gif
 ├ game.exe
 └ subitem.bin

Implementation Steps

Here’s how to programmatically create a flat ZIP archive in C#:

  1. Load the Parent ZIP Archive: Use the Archive class to load the parent ZIP.
  2. Initialize Lists: Create lists to store:
    • Entries to delete from the parent ZIP
    • Extracted entries and their names
  3. Iterate Through Archive Entries: Loop through each ArchiveEntry in the parent ZIP using the Archive.Entries collection.
  4. Process Each Entry:
    • Check if the entry is a ZIP archive using ArchiveEntry.Name.EndsWith(".zip", StringComparison.InvariantCultureIgnoreCase).
    • If it is, add it to the list of entries to delete.
    • Open the entry into a MemoryStream object using ArchiveEntry.Open().CopyTo(MemoryStream).
    • Iterate through the entries of the inner ZIP archive, performing the following:
      • Add the name of each entry to the list of entries to be added.
      • Load each entry into a MemoryStream using ArchiveEntry.Open().CopyTo(MemoryStream).
      • Add the entry to the list of entries to be added to the parent ZIP.
  5. Delete Inner ZIP Entries: Loop through the list of inner ZIP archives and delete each entry using the Archive.DeleteEntry(ArchiveEntry) method.
  6. Add New Entries to Parent ZIP: Loop through the list of entries to add and include each entry using the Archive.CreateEntry(String, Stream) method.
  7. Save the Parent ZIP Archive: Finally, save the modified parent ZIP archive using the Archive.Save(String) method.

Here’s a code sample demonstrating how to create a flat ZIP archive in C#:

Get a Free API License

You can obtain a free temporary license to use Aspose.ZIP for .NET without any evaluation limitations.

Conclusion

In this tutorial, you have learned how to efficiently create a flat ZIP archive using C#. We demonstrated the process of extracting inner ZIP archives into the parent ZIP, effectively avoiding nested folders. For further information, feel free to check out the Aspose.ZIP for .NET documentation, or reach out to us via our forum.

See Also