Accueil
Rechercher:
sur developpez.com sur les forums
Forums | Tutoriels | F.A.Q's | Participez | Hébergement | Contacts
Club Emploi Blogs   TV   Dév. Web PHP XML Python Autres 2D-3D-Jeux Sécurité Windows Linux PC Mac
Accueil Conception Java DotNET Visual Basic  C  C++ Delphi Eclipse MS-Office SQL & SGBD Oracle  4D  Business Intelligence
FORUMS .NET FAQs .NET TUTORIELS .NET SOURCES .NET LIVRES .NET OUTILS .NET BLOG .NET DOTNET TV

La compression de fichier avec .Net 2.0 (Version VB.Net)

Date de publication : 07/07/2005

Par Ronald VASSEUR (autres articles)
 

Nous allons voir dans cet article comment il est possible avec le Framework .Net 2.0 de compresser ou de décompresser un fichier au format GZip. Cette nouveauté fait suite aux demandes des développeurs qui souhaitaient que le Framework intègre de telles fonctionnalités. Toutes ces opérations sont désormais rendues possibles par l'introduction d'un nouveau namespace : le System.IO.Compression .


Introduction
1. Présentation
2. Compresser un fichier
3. Décompresser un fichier
Conclusion
Ressources


Introduction

Le Framework .Net 2.0 intègre désormais des classes qui permettent de réaliser de la compression de fichier, en effet dans la version 1.1 du Framework cela n'était pas intégré, il fallait passer par des solutions tierces, certaines étant open-source, d'autres gratuites ou même commerciales. Ici, la gestion de la compression de fichier est intégrée nativement dans le Framework, cela s'avère très utile dans de nombreuses applications. Il fallait absolument combler cette lacune et Microsoft l'a fait. En effet nous allons voir qu'il est aisé de compresser ou de décompresser un fichier avec .Net 2.0.


1. Présentation

Les classes permettant la compression de fichier se trouvent dans le namespace System.IO.Compression, ces classes comptent parmi les 1500 nouvelles introduites par la version 2.0 du Framework .Net. Deux algorithmes de compression sont pris en charge : Deflate et Gzip. Je vous renvoie à la documentation pour connaître plus en détail la structure de ces classes. Nous utiliserons dans cet article le très répandu Gzip.

Pour utiliser ces classes, il ne faut cependant pas oublier d'importer les namespaces suivants System.IO et System.IO.Compression.
Namespaces à utiliser :
Imports System.IO Imports System.IO.Compression

2. Compresser un fichier

Pour compresser un fichier nous devons d'abord le mettre dans un Stream, en effet, la compression s'effectue sur des flux de données et non directement sur le fichier, il faut donc d'abord lire le fichier grâce à un FileStream (il permet d'effectuer diverses opérations au travers du système de fichiers), puis ensuite le GZipStream va compresser ces données et les renvoyer dans un FileStream, puis le fichier .gz sera écrit sur le disque dur.

Vous allez voir dans le code commenté que pour compresser un fichier il n'y a rien de très complexe à réaliser.

Compression d'un fichier
Public Function compresserFichier(ByVal cheminSource As String, ByVal cheminDestination As String) As Boolean ' cheminSource : chemin complet du fichier à compresser ' cheminDestination : chemin complet du fichier compressé à créer Try ' Le fichier est placé dans le FileStream Dim monFileStream As New FileStream(cheminSource, FileMode.Open) Dim monBuffer(monFileStream.Length) As Byte ' Lecture de l'intégralité du FileStream monFileStream.Read(monBuffer, 0, CInt(monFileStream.Length)) ' Fermeture du FileStream monFileStream.Close() ' Création du fichier qui va contenir le fichier compressé monFileStream = New FileStream(cheminDestination, FileMode.Create) ' Compression des données Dim monGZipStream As New GZipStream(monFileStream, CompressionMode.Compress, False) ' Ecriture des données compressées dans le fichier de destination monGZipStream.Write(monBuffer, 0, monBuffer.Length) ' Fermeture du GZipStream monGZipStream.Close() Return True Catch ex As Exception Return False MsgBox(ex.Message) End Try End Function
Attention : Le fichier qui sera contenu dans l'archive au format Gzip comportera le même nom que le fichier d'origine mais sans son extension, donc si par exemple vous compressez un fichier .txt je vous recommande de nommer le fichier compressé "mon_fichier.txt.gz", ainsi si vous le décompressez avec un logiciel tierce, le fichier sera bien nommé "mon_fichier.txt" et non "mon_fichier", ce qui pourrait être ennuyeux si l'on ne connait pas l'extension de ce fichier...
Après avoir vu comment compresser un fichier, passons maintenant à la décompression.


3. Décompresser un fichier

La décompression de fichiers est une opération légèrement plus complexe que la compression, il faut tout d'abord récupérer la taille du fichier pour dimensionner le buffer, puis à l'aide d'une boucle lire les données pour les décompresser au fur et à mesure. Une fois cette opération terminée il faut écrire les données décompressées dans un nouveau fichier.

Décompresser un fichier
Public Function decompression(ByVal cheminSource As String, ByVal cheminDestination As String) As Boolean ' cheminSource : chemin complet du fichier compressé ' cheminDestination : chemin complet du fichier où le fichier doit être décompressé Try 'Lecture du fichier compresse Dim monFileStream As New FileStream(cheminSource, FileMode.Open) ' Données du fichier placées dans un GZipStream Dim monGzipStream As New GZipStream(monFileStream, CompressionMode.Decompress) ' Tableau qui va contenir la taille du fichier Dim tailleOctets(3) As Byte ' Positionnement dans le Stream pour récupérer la taille Dim position As Integer = CInt(monFileStream.Length - 4) monFileStream.Position = position ' Récupération de la taille du fichier monFileStream.Read(tailleOctets, 0, 4) ' Repositionnement en début du Stream monFileStream.Position = 0 ' Conversion de la taille du fichier en entier Dim tailleFichier As Integer = BitConverter.ToInt32(tailleOctets, 0) ' Dimesionnement du buffer Dim buffer(tailleFichier + 100) As Byte ' Offset qui permettra de se repérer dans le Stream Dim monOffset As Integer = 0 While (True) ' Les données sont décompressées et placées dans le buffer Dim decompressionOctets As Integer = monGzipStream.Read(buffer, monOffset, 100) ' Tant qu'il reste des données on continue If (decompressionOctets = 0) Then Exit While End If ' On icrémente l'offset pour ne pas repartir de 0 à chaque fois... monOffset += decompressionOctets End While ' Création du fichier décompressé monFileStream = New FileStream(cheminDestination, FileMode.Create) ' Ecriture des données décomrpessées dans le fichier monFileStream.Write(buffer, 0, tailleFichier - 1) ' Efface les données en mémoire tampon monFileStream.Flush() ' Fermeture des Streams monFileStream.Close() monGzipStream.Close() Return True Catch ex As Exception Return False MsgBox(ex.Message) End Try End Function

Conclusion

Comme vous l'avez découvert au cours de cet article il n'y a rien de compliqué pour utiliser la compression/décompression de fichier du Framework .Net 2.0. L'intégration de ces classes dans le Framework répond à une demande des développeurs, en effet, ces processus sont très fréquemment utilisés dans les applications. Un seul bémol à cette nouveauté, le manque de paramétrages avancés et d'options, comme le propose par exemple #Ziplib, mais cela ne sera cependant pas problématique dans la majorité des cas. A vos claviers pour tirer bénéfice au plus vite de cette nouveauté appréciable du Framework, et rendez-vous dans un prochain article.


Ressources



Un grand merci à Pharaonix pour la relecture de cet article.



Copyright © 2005 Ronald VASSEUR. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts. Cette page est déposée à la SACD.

Responsables bénévoles de la rubrique DotNET : Jérôme Lambert et Louis-Guillaume Morand - Contacter par EMail :
Vos questions techniques : forum d'entraide DotNET - Publiez vos articles, tutoriels et cours
et rejoignez-nous dans l'équipe de rédaction du club d'entraide des développeurs francophones
Nous contacter - Copyright © 2000-2008 www.developpez.com - Legal informations.