Spesso si ottiene un archivio ZIP che contiene altri archivi ZIP al suo interno formando una struttura annidata degli archivi. In questi casi, potresti voler ottenere una struttura piatta estraendo tutti gli archivi ZIP interni nell’archivio esterno. Per eseguire questa operazione a livello di codice, questo articolo illustra come creare un archivio ZIP flat in C#.

API C# .NET per creare archivi ZIP piatti

Per creare gli archivi ZIP flat, utilizzeremo Aspose.ZIP for .NET. È un’API di archiviazione progettata per creare ed estrarre formati di archivio popolari tra cui ZIP, TAR, GZip e 7z. Puoi installare l’API da NuGet o scaricare la sua DLL dalla sezione download.

PM> Install-Package Aspose.Zip

Crea un archivio ZIP piatto in C#

Per comprendere la struttura di un archivio ZIP flat, facciamo un esempio. Quello che segue è un archivio ZIP che contiene un altro archivio ZIP al suo interno.

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

Dopo aver trasformato questo archivio ZIP in uno ZIP piatto, tutte le voci dello ZIP interno verranno estratte nello ZIP principale. Infine, otterremo la seguente struttura dello ZIP padre.

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

Vediamo come eseguire questa trasformazione a livello di codice. Di seguito sono riportati i passaggi per creare un archivio ZIP flat in C#.

  • Innanzitutto, carica l’archivio ZIP principale usando la classe Archive.
  • Quindi, crea elenchi per memorizzare le voci ZIP interne da eliminare dallo ZIP principale, le voci estratte e i relativi nomi.
  • Successivamente, scorrere ogni ArchiveEntry nello ZIP padre utilizzando la raccolta Archive.Entries.
  • Per ogni voce, eseguire le seguenti operazioni:
    • Verificare se la voce è un archivio ZIP utilizzando il metodo ArchiveEntry.Name.EndsWith(".zip", StringComparison.InvariantCultureIgnoreCase)).
    • Quindi, aggiungi una voce all’elenco delle voci da eliminare.
    • Aprire la voce in un oggetto MemoryStream utilizzando il metodo ArchiveEntry.Open().CopyTo(MemoryStream).
    • Scorri le voci dell’archivio ZIP interno e in ogni iterazione, esegui i passaggi seguenti.
      • Aggiungere il nome della voce all’elenco delle voci da aggiungere.
      • Quindi, carica la voce in MemoryStream usando il metodo ArchiveEntry.Open().CopyTo(MemoryStream).
      • Infine, aggiungi una voce all’elenco delle voci da aggiungere allo ZIP principale.
  • Quindi, scorrere l’elenco degli archivi ZIP interni ed eliminare ogni voce utilizzando il metodo Archive.DeleteEntry(ArchiveEntry).
  • Scorri l’elenco delle voci da aggiungere allo ZIP principale e aggiungi ciascuna voce utilizzando il metodo Archive.CreateEntry(String, Stream).
  • Infine, salva l’archivio ZIP principale usando il metodo Archive.Save(String).

L’esempio di codice seguente mostra come creare un archivio ZIP flat in C#.

// Carica archivio ZIP
using (Archive outer = new Archive("Archives/nested-archive.zip"))
{
    // Crea un elenco per eliminare le voci ZIP interne dopo l'estrazione
    List<ArchiveEntry> entriesToDelete = new List<ArchiveEntry>();

    // Crea un elenco per aggiungere nomi di file negli archivi ZIP interni
    List<string> namesToInsert = new List<string>();

    // Crea un elenco per aggiungere oggetti flusso di file negli archivi ZIP interni
    List<MemoryStream> contentToInsert = new List<MemoryStream>();

    // Scorri le voci nello ZIP principale
    foreach (ArchiveEntry entry in outer.Entries)
    {
        // Controlla se la voce è un file ZIP
        if (entry.Name.EndsWith(".zip", StringComparison.InvariantCultureIgnoreCase)) 
        {
            // Aggiungi voce all'elenco per mantenere il riferimento per rimuoverlo dall'archivio in un secondo momento
            entriesToDelete.Add(entry); 

            // Crea oggetto stream per aprire l'archivio ZIP
            MemoryStream innerCompressed = new MemoryStream();
            entry.Open().CopyTo(innerCompressed);

            // Carica l'archivio ZIP dall'oggetto stream 
            using (Archive inner = new Archive(innerCompressed))
            {
                // Ripassa le voci dell'archivio
                foreach (ArchiveEntry ie in inner.Entries) 
                {
                    // Mantieni il nome della voce nell'elenco
                    namesToInsert.Add(ie.Name); 

                    // Estrai la voce di archivio in un oggetto flusso
                    MemoryStream content = new MemoryStream();
                    ie.Open().CopyTo(content);

                    // Aggiungi voce alla lista
                    contentToInsert.Add(content);
                }
            }
        }
    }

    // Elimina gli archivi ZIP interni
    foreach (ArchiveEntry e in entriesToDelete)
        outer.DeleteEntry(e);

    // Inserisci i file degli archivi ZIP interni nell'archivio ZIP principale
    for (int i = 0; i < namesToInsert.Count; i++)
        outer.CreateEntry(namesToInsert[i], contentToInsert[i]);

    outer.Save("Archives/flatten.zip");
}

Ottieni una licenza API gratuita

Puoi ottenere una licenza temporanea gratuita per utilizzare Aspose.ZIP per .NET senza limitazioni di valutazione.

Conclusione

In questo articolo si è appreso come creare un archivio ZIP flat a livello di codice in C#. In particolare, abbiamo dimostrato come creare un ZIP piatto estraendo gli archivi ZIP interni nello ZIP padre. A parte questo, puoi visitare la documentazione per saperne di più su Aspose.ZIP per .NET. Inoltre, puoi condividere le tue domande con noi tramite il nostro forum.

Guarda anche