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.