Compresser ou décompresser des fichiers dans .NET
Aperçu
Cet article vous apprendra comment compresser par programme des fichiers Zip à l’aide de diverses méthodes utilisant C# ou l’API .NET et un exemple de code. Vous apprendrez à compresser ou compresser un ou plusieurs fichiers, ainsi qu’à compresser des fichiers simultanément. Vous apprendrez également à décompresser ou décompresser des fichiers.
Zipper ou compresser des fichiers en C# et décompresser ou décompresser des fichiers en C#
L’API Aspose.ZIP vous permet de compresser et décompresser des fichiers sans vous soucier de la structure des fichiers sous-jacents. Cet article montre l’utilisation de la compression de fichiers uniques ou multiples.
Compression de fichiers
Compression d’un seul fichier
Étapes : Compression d’un seul fichier en C#
- Créez un file stream avec le nom souhaité de votre fichier zip de sortie.
- Créez un flux de fichiers du fichier de données à compresser.
- Créez une instance de la classe Archive et transmettez-la à l’instance de la classe ArchiveEntrySettings.
- Ajoutez le fichier de données créé à l’étape 2 à l’aide de la méthode Archive.CreateEntry.
- Compressez le fichier de données à l’aide de la méthode Archive.Save et transmettez-lui le flux de fichiers créé à l’étape 1.
1 // For complete examples and data files, please go to https://github.com/aspose-zip/Aspose.ZIP-for-.NET
2 using (FileStream zipFile = File.Open(dataDir + "CompressSingleFile_out.zip", FileMode.Create))
3 {
4 //File to be added to archive
5 using (FileStream source1 = File.Open(dataDir + "alice29.txt", FileMode.Open, FileAccess.Read))
6 {
7 using (var archive = new Archive(new ArchiveEntrySettings()))
8 {
9 archive.CreateEntry("alice29.txt", source1);
10
11 archive.Save(zipFile);
12 }
13 }
14 }
Compression de plusieurs fichiers
Étapes : Compresser plusieurs fichiers en C#
- Créez un flux de fichiers avec le nom souhaité de votre fichier zip de sortie.
- Créez un flux de fichiers du premier fichier de données à compresser.
- Créez un flux de fichiers du deuxième fichier de données à compresser.
- Créez une instance de la classe Archive.
- Ajoutez les fichiers de données créés aux étapes 2 et 3 à l’aide de la méthode Archive.CreateEntry.
- Créez une instance de la classe ArchiveSaveOptions.
- Compressez les fichiers de données à l’aide de la méthode Archive.Save et transmettez-lui le flux de fichiers créé à l’étape 1 et l’instance de ArchiveSaveOptions créée à l’étape ci-dessus.
1 // For complete examples and data files, please go to https://github.com/aspose-zip/Aspose.ZIP-for-.NET
2 using (FileStream zipFile = File.Open(dataDir + "CompressMultipleFiles_out.zip", FileMode.Create))
3 {
4 using (FileStream source1 = File.Open(dataDir + "alice29.txt", FileMode.Open, FileAccess.Read))
5 {
6 using (FileStream source2 = File.Open(dataDir + "asyoulik.txt", FileMode.Open, FileAccess.Read))
7 {
8 using (var archive = new Archive())
9 {
10 archive.CreateEntry("alice29.txt", source1);
11 archive.CreateEntry("asyoulik.txt", source2);
12 archive.Save(zipFile, new ArchiveSaveOptions() { Encoding = Encoding.ASCII, ArchiveComment = "There are two poems from Canterbury corpus" });
13 }
14 }
15 }
16 }
17
Compresser les fichiers par informations sur le fichier
Étapes : Compresser les fichiers par informations de fichier en C#
- Ouvrez un flux de fichiers avec FileMode.Create avec le nom souhaité de votre fichier zip de sortie.
- Créez l’objet FileInfo de votre premier fichier de données à compresser.
- Créez l’objet FileInfo de votre deuxième fichier de données à compresser.
- Créez une instance de la classe Archive.
- Ajoutez les fichiers de données créés aux étapes 2 et 3 à l’aide de la méthode Archive.CreateEntry.
- Créez une instance de la classe ArchiveSaveOptions.
- Compressez les fichiers de données à l’aide de la méthode Archive.Save et transmettez-lui le flux de fichiers créé à l’étape 1 et l’instance de ArchiveSaveOptions créée à l’étape ci-dessus.
1 // For complete examples and data files, please go to https://github.com/aspose-zip/Aspose.ZIP-for-.NET
2 using (FileStream zipFile = File.Open(dataDir + "CompressFilesByFileInfo_out.zip", FileMode.Create))
3 {
4 FileInfo fi1 = new FileInfo(dataDir + "alice29.txt");
5 FileInfo fi2 = new FileInfo(dataDir + "fields.c");
6
7 using (var archive = new Archive())
8 {
9 archive.CreateEntry("alice29.txt", fi1);
10 archive.CreateEntry("fields.c", fi2);
11 archive.Save(zipFile, new ArchiveSaveOptions() { Encoding = Encoding.ASCII });
12 }
13 }
14
Stockage de fichiers dans des archives sans compression
Étapes : Stockage Fichiers vers des archives sans compression en utilisant C#1. Ouvrez un flux de fichiers avec FileMode.Create avec le nom souhaité de votre fichier zip de sortie. 2. Créez des objets FileInfo pour que vos fichiers de données soient stockés dans les archives. 3. Créez une instance de la classe ArchiveEntrySettings et transmettez-la à l’instance de la classe StoreCompressionSettings. 4. Créez une instance de la classe Archive et transmettez-la à l’instance de la classe ArchiveEntrySettings créée à l’étape ci-dessus. 5. Ajoutez les objets FileInfo créés à l’étape 2 à l’aide de la méthode Archive.CreateEntry. 6. Créez une instance de ArchiveSaveOptions et définissez Encoding = Encoding.ASCII. 7. Compressez les fichiers de données à l’aide de la méthode Archive.Save et transmettez-lui le flux de fichiers créé à l’étape 1 et l’instance de ArchiveSaveOptions créée à l’étape ci-dessus.
1 // For complete examples and data files, please go to https://github.com/aspose-zip/Aspose.ZIP-for-.NET
2 //Creates zip archive without compressing files
3 using (FileStream zipFile = File.Open(dataDir + "StoreMultipleFilesWithoutCompression_out.zip", FileMode.Create))
4 {
5 FileInfo fi1 = new FileInfo(dataDir + "alice29.txt");
6 FileInfo fi2 = new FileInfo(dataDir + "lcet10.txt");
7
8 using (Archive archive = new Archive(new ArchiveEntrySettings(new StoreCompressionSettings())))
9 {
10 archive.CreateEntry("alice29.txt", fi1);
11 archive.CreateEntry("lcet10.txt", fi2);
12 archive.Save(zipFile, new ArchiveSaveOptions() { Encoding = Encoding.ASCII });
13 }
14
15 }
16
Utiliser le parallélisme pour compresser des fichiers
Étapes : Utiliser le parallélisme pour compresser des fichiers en utilisant C#
- Ouvrez un flux de fichiers avec FileMode.Create avec le nom souhaité de votre fichier zip de sortie.
- Ouvrez les flux de fichiers avec FileMode.Open et FileAccess.Read pour que vos premier et deuxième fichiers de données soient compressés.
- Créez une instance de la classe Archive.
- Ajoutez les fichiers de données créés à l’étape 2 à l’aide de la méthode Archive.CreateEntry.
- Créez une instance de ParallelOptions et définissez ParallelCompressInMemory = ParallelCompressionMode.Always.
- Créez une instance de ArchiveSaveOptions et définissez sa propriété ParallelOptions avec l’instance ci-dessus.
- Compressez les fichiers de données à l’aide de la méthode Archive.Save et transmettez-lui le flux de fichiers créé à l’étape 1 et l’instance de ArchiveSaveOptions créée à l’étape ci-dessus.
1 // For complete examples and data files, please go to https://github.com/aspose-zip/Aspose.ZIP-for-.NET
2 using (FileStream zipFile = File.Open(dataDir + "UsingParallelismToCompressFiles_out.zip", FileMode.Create))
3 {
4 using (FileStream source1 = File.Open(dataDir + "alice29.txt", FileMode.Open, FileAccess.Read))
5 {
6 using (FileStream source2 = File.Open(dataDir + "asyoulik.txt", FileMode.Open, FileAccess.Read))
7 {
8 using (var archive = new Archive())
9 {
10 archive.CreateEntry("alice29.txt", source1);
11 archive.CreateEntry("asyoulik.txt", source2);
12 //Define the parallelism criterion
13 var parallelOptions = new ParallelOptions
14 {
15 ParallelCompressInMemory = ParallelCompressionMode.Always
16 };
17 archive.Save(zipFile,
18 new ArchiveSaveOptions()
19 {
20 ParallelOptions = parallelOptions,
21 Encoding = Encoding.ASCII,
22 ArchiveComment = "There are two poems from Canterbury corpus"
23 });
24 }
25 }
26 }
27 }
28
Compression LZMA dans l’archive ZIP
L’algorithme de chaîne de Lempel-Ziv-Markov (LZMA) est un algorithme utilisé pour effectuer une compression de données sans perte. LZMA utilise un algorithme de compression par dictionnaire, le flux compressé est un flux de bits. La compression LZMA au sein de l’archive ZIP permet aux conteneurs ZIP de contenir des entrées compressées LZMA. L’exemple de code suivant montre l’implémentation de la compression LZMA à l’aide de l’API Aspose.ZIP.
Étapes : Compression LZMA dans l’archive ZIP en utilisant C#
- Ouvrez un flux de fichiers avec FileMode.Create avec le nom souhaité de votre fichier zip de sortie.
- Créez une instance de ArchiveEntrySettings et transmettez-lui l’instance de la classe LzmaCompressionSettings.
- Créez une instance de la classe Archive et transmettez-lui l’instance de ArchiveEntrySettings créée ci-dessus.
- Ajoutez les fichiers de données à compresser via les chemins de fichiers à l’aide de la méthode Archive.CreateEntry.
- Compressez les fichiers de données à l’aide de la méthode Archive.Save.
1 using (FileStream zipFile = File.Open(dataDir + "LZMACompression_out.zip", FileMode.Create))
2 {
3 using (Archive archive = new Archive(new ArchiveEntrySettings(new LzmaCompressionSettings())))
4 {
5 archive.CreateEntry("sample.txt", dataDir + "sample.txt");
6 archive.Save(zipFile);
7 }
8 }
Compression BZip2 dans l’archive ZIP
Les paramètres de compression BZip2 permettent au conteneur ZIP de contenir des entrées compressées BZip2. L’exemple de code suivant montre l’implémentation de la compression BZip2 à l’aide de l’API Aspose.ZIP.
Étapes : Compression BZip2 dans l’archive ZIP en utilisant C#
- Ouvrez un flux de fichiers avec FileMode.Create avec le nom souhaité de votre fichier zip de sortie.
- Créez une instance de ArchiveEntrySettings et transmettez-lui l’instance de la classe Bzip2CompressionSettings.
- Créez une instance de la classe Archive et transmettez-lui l’instance de ArchiveEntrySettings créée ci-dessus.
- Ajoutez les fichiers de données à compresser via les chemins de fichiers à l’aide de la méthode Archive.CreateEntry.
- Compressez les fichiers de données à l’aide de la méthode Archive.Save.
1 using (FileStream zipFile = File.Open(dataDir + "Bzip2Compression_out.zip", FileMode.Create))
2 {
3 using (Archive archive = new Archive(new ArchiveEntrySettings(new Bzip2CompressionSettings())))
4 {
5 archive.CreateEntry("sample.txt", dataDir + "sample.txt");
6 archive.Save(zipFile);
7 }
8 }
9
Compression PPMd dans l’archive ZIP
Les paramètres de compression PPMd permettent au conteneur ZIP de contenir des entrées compressées PPMd. L’exemple de code suivant a démontré l’implémentation de la compression PPMd à l’aide de l’API Aspose.ZIP.
Étapes : Compression PPMd dans l’archive ZIP en utilisant C#
- Ouvrez un flux de fichiers avec FileMode.Create avec le nom souhaité de votre fichier zip de sortie.
- Créez une instance de ArchiveEntrySettings et transmettez-lui l’instance de la classe PPMdCompressionSettings.
- Créez une instance de la classe Archive et transmettez-lui l’instance de ArchiveEntrySettings créée ci-dessus.
- Ajoutez les fichiers de données à compresser via les chemins de fichiers à l’aide de la méthode Archive.CreateEntry.
- Compressez les fichiers de données à l’aide de la méthode Archive.Save.
1 using (FileStream zipFile = File.Open(dataDir + "PPMdCompression_out.zip", FileMode.Create))
2 {
3 using (Archive archive = new Archive(new ArchiveEntrySettings(new PPMdCompressionSettings())))
4 {
5 archive.CreateEntry("sample.txt", dataDir + "sample.txt");
6 archive.Save(zipFile);
7 }
8 }
9
Décompression des archives
** Décompresser l’archive ayant un seul fichier **
Étapes : Décompresser un seul fichier d’une archive à l’aide de C#
- Ouvrez un flux de fichiers pour le fichier ZIP d’entrée à l’aide de FileMode.OpenRead.
- Créez une instance de la classe Archive en transmettant le flux de fichiers au constructeur.
- Surveillez la progression de la décompression à l’aide de l’événement ExtractionProgressed de l’entrée d’archive.
- Extrayez le fichier unique de l’archive à l’aide de la méthode Extract, en spécifiant le chemin du fichier de sortie.
- Affichez la progression de la décompression en pourcentage dans la console
1 // For complete examples and data files, please go to https://github.com/aspose-zip/Aspose.ZIP-for-.NET
2 using (FileStream fs = File.OpenRead(dataDir + "CompressSingleFile_out.zip"))
3 {
4 using (Archive archive = new Archive(fs))
5 {
6 int percentReady = 0;
7 archive.Entries[0].ExtractionProgressed += (s, e) =>
8 {
9 int percent = (int)((100 * e.ProceededBytes) / ((ArchiveEntry)s).UncompressedSize);
10 if (percent > percentReady)
11 {
12 Console.WriteLine(string.Format("{0}% decompressed", percent));
13 percentReady = percent;
14 }
15 };
16 archive.Entries[0].Extract(dataDir + "alice_extracted_out.txt");
17 }
18 }
19
** Décompresser l’archive contenant plusieurs fichiers **
Étapes : Décompressez plusieurs fichiers d’une archive à l’aide de C#< /fort>
- Ouvrez un flux de fichiers pour le fichier ZIP d’entrée à l’aide de FileMode.Open.
- Créez une instance de la classe Archive avec des options de chargement personnalisées pour répertorier les entrées et suivre la progression de la décompression.
- Affichez les noms de toutes les entrées d’archive à l’aide de l’événement EntryListed.
- Surveillez la progression de la décompression avec l’événement EntryExtractionProgressed, affichant la progression dans la console.
- Extrayez plusieurs fichiers de l’archive, en utilisant la méthode Extract et en lisant les données dans les fichiers de sortie.
1 // For complete examples and data files, please go to https://github.com/aspose-zip/Aspose.ZIP-for-.NET
2 using (FileStream zipFile = File.Open(dataDir + "CompressMultipleFiles_out.zip", FileMode.Open))
3 {
4 StringBuilder sb = new StringBuilder("Entries are: ");
5 int percentReady = 0;
6 using (Archive archive = new Archive(zipFile,
7 new ArchiveLoadOptions()
8 {
9 EntryListed = (s, e) => { sb.AppendFormat("{0}, ", e.Entry.Name); },
10 EntryExtractionProgressed = (s, e) =>
11 {
12 int percent = (int)((100 * e.ProceededBytes) / ((ArchiveEntry)s).UncompressedSize);
13 if (percent > percentReady)
14 {
15 Console.WriteLine(string.Format("{0}% compressed", percent)); percentReady = percent;
16 }
17 }
18 }))
19 {
20 Console.WriteLine(sb.ToString(0, sb.Length - 2));
21 using (var extracted = File.Create(dataDir + "alice_extracted_out.txt"))
22 {
23 using (var decompressed = archive.Entries[0].Open())
24 {
25 byte[] buffer = new byte[8192];
26 int bytesRead;
27 while (0 < (bytesRead = decompressed.Read(buffer, 0, buffer.Length)))
28 {
29 extracted.Write(buffer, 0, bytesRead);
30 }
31 // Read from decompressed stream to extracting file.
32 }
33 }
34 percentReady = 0;
35 archive.Entries[1].Extract(dataDir + "asyoulik_extracted_out.txt");
36 }
37 }
38
Extraire les archives stockées sans compression
Étapes : Extraire les fichiers d’une archive et les enregistrer sur le disque en utilisant C#
- Ouvrez le fichier ZIP et créez une instance de la classe Archive.
- Extrayez le premier fichier de l’archive en ouvrant le flux de l’entrée et en écrivant son contenu dans un nouveau fichier.
- Utilisez un tampon pour lire les données du flux décompressé et enregistrez-les dans le fichier de sortie.
- Répétez le processus pour le deuxième fichier de l’archive, en écrivant son contenu dans un fichier de sortie distinct.
1 // For complete examples and data files, please go to https://github.com/aspose-zip/Aspose.ZIP-for-.NET
2 using (FileStream zipFile = File.Open(dataDir + "StoreMultipleFilesWithoutCompression_out.zip", FileMode.Open))
3 {
4 using (Archive archive = new Archive(zipFile))
5 {
6 using (var extracted = File.Create(dataDir + "alice_extracted_store_out.txt"))
7 {
8 using (var decompressed = archive.Entries[0].Open())
9 {
10 byte[] buffer = new byte[8192];
11 int bytesRead;
12 while (0 < (bytesRead = decompressed.Read(buffer, 0, buffer.Length)))
13 {
14 extracted.Write(buffer, 0, bytesRead);
15 }
16 // Read from decompressed stream to extracting file.
17 }
18 }
19
20 using (var extracted = File.Create(dataDir + "asyoulik_extracted_store_out.txt"))
21 {
22 using (var decompressed = archive.Entries[1].Open())
23 {
24 byte[] buffer = new byte[8192];
25 int bytesRead;
26 while (0 < (bytesRead = decompressed.Read(buffer, 0, buffer.Length)))
27 {
28 extracted.Write(buffer, 0, bytesRead);
29 }
30 // Read from decompressed stream to extracting file.
31 }
32 }
33 }
34 }
35