Souvent, vous obtenez une archive ZIP qui contient d’autres archives ZIP à l’intérieur formant une structure imbriquée des archives. Dans de tels cas, vous souhaiterez peut-être obtenir une structure plate en extrayant toutes les archives ZIP internes dans l’archive externe. Pour effectuer cette opération par programme, cet article montre comment créer une archive ZIP plate en C#.

API C# .NET pour créer des archives ZIP plates

Pour créer les archives ZIP plates, nous utiliserons Aspose.ZIP for .NET. Il s’agit d’une API d’archivage conçue pour créer et extraire des formats d’archives populaires, notamment ZIP, TAR, GZip et 7z. Vous pouvez soit installer l’API à partir de NuGet ou télécharger sa DLL à partir de la section téléchargements.

PM> Install-Package Aspose.Zip

Créer une archive ZIP plate en C#

Pour comprendre la structure d’une archive ZIP plate, prenons un exemple. Ce qui suit est une archive ZIP qui contient une autre archive ZIP à l’intérieur.

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

Après avoir transformé cette archive ZIP en ZIP plat, toutes les entrées du ZIP interne seront extraites dans le ZIP parent. Enfin, nous obtiendrons la structure suivante du ZIP parent.

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

Voyons comment effectuer cette transformation par programmation. Voici les étapes pour créer une archive ZIP plate en C#.

  • Tout d’abord, chargez l’archive ZIP parente à l’aide de la classe Archive.
  • Ensuite, créez des listes pour stocker les entrées ZIP internes à supprimer du ZIP parent, les entrées extraites et leurs noms.
  • Après cela, parcourez chaque ArchiveEntry dans le ZIP parent en utilisant la collection Archive.Entries.
  • Pour chaque entrée, effectuez les opérations suivantes :
    • Vérifiez si l’entrée est une archive ZIP à l’aide de la méthode ArchiveEntry.Name.EndsWith(".zip", StringComparison.InvariantCultureIgnoreCase)).
    • Ensuite, ajoutez une entrée à la liste des entrées à supprimer.
    • Ouvrez une entrée dans un objet MemoryStream à l’aide de la méthode ArchiveEntry.Open().CopyTo(MemoryStream).
    • Parcourez les entrées de l’archive ZIP interne et, à chaque itération, effectuez les étapes suivantes.
      • Ajouter le nom de l’entrée dans la liste des entrées à ajouter.
      • Ensuite, chargez l’entrée dans MemoryStream à l’aide de la méthode ArchiveEntry.Open().CopyTo(MemoryStream).
      • Enfin, ajoutez une entrée à la liste des entrées à ajouter au ZIP parent.
  • Ensuite, parcourez la liste des archives ZIP internes et supprimez chaque entrée à l’aide de la méthode Archive.DeleteEntry(ArchiveEntry).
  • Parcourez la liste des entrées à ajouter au ZIP parent et ajoutez chaque entrée à l’aide de la méthode Archive.CreateEntry(String, Stream).
  • Enfin, enregistrez l’archive ZIP parente à l’aide de la méthode Archive.Save(String).

L’exemple de code suivant montre comment créer une archive ZIP plate en C#.

// Charger l'archive ZIP
using (Archive outer = new Archive("Archives/nested-archive.zip"))
{
    // Créer une liste pour supprimer les entrées ZIP internes après l'extraction
    List<ArchiveEntry> entriesToDelete = new List<ArchiveEntry>();

    // Créer une liste pour ajouter des noms de fichiers dans les archives ZIP internes
    List<string> namesToInsert = new List<string>();

    // Créer une liste pour ajouter des objets de flux de fichiers dans des archives ZIP internes
    List<MemoryStream> contentToInsert = new List<MemoryStream>();

    // Boucle dans les entrées du ZIP parent
    foreach (ArchiveEntry entry in outer.Entries)
    {
        // Vérifiez si l'entrée est un fichier ZIP
        if (entry.Name.EndsWith(".zip", StringComparison.InvariantCultureIgnoreCase)) 
        {
            // Ajouter une entrée à la liste pour conserver la référence afin de la supprimer ultérieurement de l'archive
            entriesToDelete.Add(entry); 

            // Créer un objet de flux pour ouvrir l'archive ZIP
            MemoryStream innerCompressed = new MemoryStream();
            entry.Open().CopyTo(innerCompressed);

            // Charger l'archive ZIP à partir de l'objet de flux 
            using (Archive inner = new Archive(innerCompressed))
            {
                // Boucle sur les entrées de l'archive
                foreach (ArchiveEntry ie in inner.Entries) 
                {
                    // Conserver le nom de l'entrée dans la liste
                    namesToInsert.Add(ie.Name); 

                    // Extraire l'entrée d'archive dans un objet de flux
                    MemoryStream content = new MemoryStream();
                    ie.Open().CopyTo(content);

                    // Ajouter une entrée à la liste
                    contentToInsert.Add(content);
                }
            }
        }
    }

    // Supprimer les archives ZIP internes
    foreach (ArchiveEntry e in entriesToDelete)
        outer.DeleteEntry(e);

    // Insérez les fichiers des archives ZIP internes dans l'archive ZIP parente
    for (int i = 0; i < namesToInsert.Count; i++)
        outer.CreateEntry(namesToInsert[i], contentToInsert[i]);

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

Obtenez une licence API gratuite

Vous pouvez obtenir une licence temporaire gratuite pour utiliser Aspose.ZIP for .NET sans limitation d’évaluation.

Conclusion

Dans cet article, vous avez appris à créer une archive ZIP plate par programmation en C#. En particulier, nous avons montré comment créer un ZIP plat en extrayant les archives ZIP internes dans le ZIP parent. En dehors de cela, vous pouvez visiter la documentation pour en savoir plus sur Aspose.ZIP for .NET. Vous pouvez également partager vos questions avec nous via notre forum.

Voir également