Exporter (0) Imprimer
Développer tout

Implémentation de la compression et du cryptage des fichiers dans VB6 à l'aide de Microsoft .NET Framework

Visual Studio .NET 2003

Partie II - Compression

Auteur : Scott Swigart, Swigart Consulting LLC.

Consultez l'article en anglais 

Téléchargez les fichiers projets

Dans cette série d'articles en deux parties, nous vous expliquons comment ajouter facilement des fonctionnalités de cryptage et de compression des données (ZIP) aux applications VB6 existantes à l'aide de l'environnement .NET Framework. S'il est vrai que le cryptage et la compression ne semblent pas être, a priori, des technologies apparentées, en y réfléchissant, on constate que chacune d'elles prend un ensemble de données sur lequel elle effectue une transformation. Dans le cas du cryptage, les données sont rendues illisibles, tandis qu'avec la compression leur taille est réduite. Nous allons voir que les deux utilisent un grand nombre de technologies sous-jacentes communes.

Sur cette page

Introduction Introduction
Compression Compression
Compression des fichiers et des dossiers Compression des fichiers et des dossiers
Exécution de l'exemple Exécution de l'exemple
Conclusion Conclusion
Scott Swigart - Biographie Scott Swigart - Biographie

Introduction

Jusqu'ici, dans la série d'articles VB Fusion, nous vous avons présenté les nombreuses fonctionnalités offertes par Microsoft .NET Framework, mais vous devez aussi savoir qu'il existe une quantité considérable de code Open Source de qualité, facile à utiliser à partir de vos applications VB6. En créant des wrappers très légers, vous pouvez exposer les fonctionnalités disponibles dans les bibliothèques Open Source ou dans celles de tiers, initialement développées pour être utilisées dans les applications .NET, afin d'étendre vos applications VB6. Des sites tels que http://sourceforge.net/index.php et http://www.gotdotnet.com/ contiennent littéralement des milliers de projets Open Source offrant une gamme extrêmement large de fonctionnalités complémentaires. À titre d'exemple, l'on peut citer les bibliothèques consacrées à la communication RS232 (port série), à l'utilisation des fils RSS, à la manipulation des fichiers d'images et médias, aux bibliothèques réseau, aux bibliothèques FTP, à la réplication des fichiers, ainsi que des milliers d'autres bibliothèques.

Ce présent article traite de l'utilisation d'une de ces bibliothèques Open Source pour la compression des fichiers. SharpZipLib est un projet Open Source offrant une fonctionnalité de compression (zip). Si vous le souhaitez, vous pouvez inclure librement cette bibliothèque dans un logiciel commercial avec source privée.

Avant de rentrer dans les détails d'utilisation de SharpZipLib, il est important de comparer la manière dont les E/S du fichier .NET diffèrent de celles du fichier VB6. En bref, VB6 utilise des mots clés pour contrôler les entrées et les sorties du fichier :

Liste 1. Lecture d'un fichier avec Visual Basic 6

Dim dataIn As String
Open someFileName For Input As #1
Do Until Eof(1)
    Line Input #1, dataIn
    Debug.Print dataIn
Loop
Close #1
		

Dans Visual Basic .NET, vous utilisez plutôt certaines classes spécifiques de l'environnement .NET Framework pour exécuter les opérations d'E/S :

Liste 2 : E/S du fichier Visual Basic .NET

Dim dataIn As String
Dim sw As New StreamWriter("C:\log.txt")
sw.WriteLine("This is a test")
sw.Close()
		

Avec VB6, vous devez gérer les handles de fichiers et connaître les mots clés du langage associé, nécessaires pour travailler avec le handle en question. Avec Visual Basic .NET, la classe StreamWriter enveloppe toutes les fonctionnalités associées aux fichiers. Vous n'avez pas besoin de gérer les handles de fichiers et les opérations sur les fichiers sont plus simples à découvrir, car IntelliSense vous montre toutes les opérations (WriteLine, etc.) disponibles pendant que vous les manipulez.

Mais l'avantage réel de ces objets (également appelés flux) tient à ce qu'ils vous permettent d'empiler la fonctionnalité d'E/S du fichier. Dans le premier article, nous avons vu comment le cryptage était pris en charge par le simple ajout d'un CryptoStream à la pile des flux d'E/S :

Liste 3 : Empilement de flux pour activer le cryptage avec VB.NET

fs = New FileStream(fileName, FileMode.Create, FileAccess.Write)
cs = New CryptoStream(fs, rc2.CreateEncryptor(), CryptoStreamMode.Write)
sw = New StreamWriter(cs)
		

Ainsi, toutes les données écrites sur StreamWriter sont envoyées ensuite via CryptoStream où elles sont cryptées, puis à FileStream où elles sont écrites sur disque.

Compression

La compression fonctionne exactement de la même manière :

Liste 4. Empilement des flux pour activer la compression avec VB.NET

Dim fs = New FileStream(fileName, FileMode.Create, FileAccess.Write)
zs = New GZipOutputStream(fs)
sw = New StreamWriter(zs)
		

Comme vous pouvez le voir, en toute logique, la compression traite les E/S des fichiers exactement de la même manière que le cryptage. Le cryptage et la compression ne sont en fait qu'une simple transformation des données. Avec le cryptage, les données sont transformées en un format illisible sans une clé. Avec la compression, elles sont transformées de manière à représenter les mêmes données par un plus petit nombre d'octets.

La classe .NET complète qui vous permet d'écrire des informations dans un fichier compressé est la suivante :

Liste 5 : Classe VB.NET complète nécessaire pour écrire dans un fichier compressé

Public Class GZipFileWriterWrapper
    Private fs As FileStream
    Private zs As GZipOutputStream
    Private sw As StreamWriter

    Public Sub Open(ByVal fileName As String)
        fs = New FileStream(fileName, FileMode.Create, FileAccess.Write)
        zs = New GZipOutputStream(fs)
        sw = New StreamWriter(zs)
    End Sub

    Public Sub WriteLine(ByVal value As String)
        sw.WriteLine(value)
    End Sub

    Public Sub Write(ByVal value As String)
        sw.Write(value)
    End Sub

    Public Sub WriteBytes(ByRef bytes() As Byte)
        zs.Write(bytes, 0, bytes.Length)
    End Sub

    Public Sub Close()
        On Error Resume Next
        If Not sw Is Nothing Then sw.Close()
        If Not zs Is Nothing Then zs.Close()
        If Not fs Is Nothing Then fs.Close()
    End Sub
End Class
		

Il est temps maintenant d'utiliser cette classe à partir d'une application VB6, pour écrire des informations dans un fichier compressé. Avec ce wrapper en place, le code VB6 est simple :

Liste 6 : Code VB6 à écrire dans un fichier compressé

Dim e As wrappers.GZipFileWriterWrapper
Set e = New wrappers.GZipFileWriterWrapper
    
e.Open "c:\file.gzip"
e.WriteLine (txtMessage)
e.Close
    
txtMessage = ""
MsgBox "Compressed and Saved"
		

Vous constatez qu'il vous suffit d'utiliser le wrapper pour ouvrir le fichier, écrire autant que vous le souhaitez, puis le fermer lorsque vous avez terminé. Si vous essayez d'ouvrir le fichier disque dans le bloc-notes par exemple, vous pouvez voir qu'il a été écrit dans un format compressé binaire :

Figure 1

Toutefois, avec une application VB6, vous pouvez aisément utiliser le wrapper pour relire les informations :

Liste 7 : Lecture du fichier compressé avec VB6

e.Open "c:\file.gzip"
While Not e.EOF
    txtMessage = txtMessage & e.ReadLine & vbCrLf
    ' Could also just use e.ReadToEnd to read
    ' the entire file.
Wend
e.Close
		

Compression des fichiers et des dossiers

Le type de compression décrit jusqu'ici vous permet de compresser les informations avant de les placer dans un fichier. Pourtant, il est courant de créer des archives Zip, constituées d'un fichier Zip contenant un ou plusieurs fichiers disques. Cette fonctionnalité est fournie avec le wrapper suivant de SharpZipLib :

Liste 8 : Wrapper VB.NET pour créer une archive Zip

Public Sub ZipFile(ByVal source As String, ByVal dest As String)

    Dim entry As New ZipEntry(Path.GetFileName(source))
    Dim fi As New FileInfo(source)
    entry.ExternalFileAttributes = fi.Attributes
    entry.Size = fi.Length

    Dim input As FileStream = File.OpenRead(source)
    Dim output As New ZipOutputStream(File.Create(dest))

    output.PutNextEntry(entry)

    Dim buffer(8191) As Byte
    Dim len As Integer
    Do
        len = input.Read(buffer, 0, buffer.Length)
        If len > 0 Then
            output.Write(buffer, 0, len)
        End If
    Loop Until len = 0
    output.Close()
    input.Close()
End Sub
		

Dans ce cas, la classe ZipEntry est utilisée pour écrire des informations concernant le fichier qui sera ajouté à l'archive. Dès que ZipEntry est enregistré dans ZipOutputStream, les données réelles contenues dans le fichier sont écrites. L'archive Zip ainsi créée peut être ouverte à l'aide de WinZip ou de la fonctionnalité Zip intégrée dans Windows XP. Maintenant que le wrapper est créé, la compression d'un fichier à partir de VB6 est très simple :

Liste 9 : Compression d'un fichier à partir de VB6

CommonDialog1.ShowOpen
Dim source As String
source = CommonDialog1.FileName
    
Dim e As wrappers.FileZipWrapper
Set e = New wrappers.FileZipWrapper
e.ZipFile source, source & ".zip"
		

Ce message invite l'utilisateur à désigner un fichier à compresser, puis utilise le wrapper pour effectuer la compression. L'archive Zip ainsi créée est lisible par Windows XP ou par d'autres lecteurs Zip :

Figure 2

Enfin, si vous souhaitez compresser un dossier complet, vous disposez également d'un wrapper pour effectuer cette opération :

Liste 10 : Code VB6 pour compresser une structure de dossier complète

Dim e As wrappers.FileZipWrapper
Set e = New wrappers.FileZipWrapper
    
e.ZipFolder App.Path, App.Path & "\..\file.zip"
		

Exécution de l'exemple

Dans la partie I de cette série d'articles, nous avions créé un exemple pour vous permettre de vous entraîner à utiliser la fonctionnalité de cryptage. Je l'ai modifié de manière à utiliser les wrappers de compression fournis ici. Pour utiliser l'exemple :

  1. Téléchargez et installez Microsoft .NET Framework SDK 1.1 (si vous avez installé Visual Studio .NET 2003, vous pouvez ignorer cette étape).

  2. Téléchargez le code associé à cet article.

  3. Exécutez le fichier « Build and Register.bat » inclus avec le code pour cet article. Cette opération crée le composant de cryptage et l'enregistre de manière à ce que vous puissiez l'utiliser à partir de votre application VB6.

  4. Dans le code pour cet article, ouvrez le projet VB6 dans le dossier « Compression ».

  5. Appuyez sur F5 pour exécuter l'exemple d'application :
    Figure 3

  6. Lorsque vous cliquez sur « Compress » (Compresser), le texte dans la zone de texte est écrit dans un fichier utilisant l'algorithme de compression GZip. Lorsque vous cliquez sur « Decompress » (Décompresser), le contenu est décrypté et affiché.

  7. Lorsque vous cliquez sur « Zip File » (Compresser le fichier), un message vous invite à choisir un fichier. Cette action crée une archive .zip contenant le fichier. « Unzip File » (Décompresser le fichier) extrait le fichier de l'archive.

  8. Enfin « Zip Folder » (Compresser le dossier) compresse le contenu d'un dossier complet.

Pour utiliser cette fonctionnalité à partir de votre propre application, il vous suffit d'exécuter « Build and Register.bat », puis d'ajouter une référence à « wrappers.tlb » dans le dossier « c:\tlbs ».

Conclusion

Microsoft .NET Framework inclut des fonctionnalités étendues pour de nombreux scénarios, mais la communauté Open Source a apporté sa contribution en proposant un nombre étonnant de fonctionnalités supplémentaires, qu'il est possible d'envelopper et d'employer très facilement à partir de VB6. Dans une certaine mesure, ce n'est pas nouveau. VB6 a toujours bénéficié d'une vaste communauté qui a contribué généreusement à l'apport d'exemples de code : il s'agit parfois d'extraits de code, parfois de bibliothèques complètes. Avec VB6, vous étiez limité au code développé et partagé par d'autres développeurs VB6. En revanche, avec .NET, les développeurs à la fois VB.NET et C# peuvent apporter du code utilisable par votre application (SharpZipLib a été écrit en C#, mais il n'est pas plus difficile à envelopper et à utiliser à partir de VB6 que s'il avait été écrit en VB.NET). Par ailleurs, un nombre considérable de bibliothèques écrites à l'origine en C++ et Java ont été portées sur .NET. En d'autres termes, vous avez à votre disposition des milliers de bibliothèques supplémentaires, dont la plupart sont développées, améliorées et utilisées dans des applications de production depuis plusieurs années.

Comme l'a montré la série d'articles VB Fusion, vous pouvez tirer parti de la richesse de .NET tout en protégeant les investissements déjà consentis en code VB6. Comme le prouve cet article, vous n'êtes en aucun cas limité au .NET Framework et aux seules bibliothèques fournies par Microsoft. Vous avez la florissante communauté .NET à votre entière disposition.

Scott Swigart - Biographie

Scott Swigart http://www.swigartconsulting.com/, consacre la majeure partie de son temps à conseiller les entreprises sur la meilleure façon d'utiliser la technologie actuelle et de préparer l'avenir. Dans cette lignée, il a contribué au site VB Fusion, dans le cadre duquel il a apporté des informations et préconisé des stratégies d'utilisation réelle à l'attention des développeurs VB désireux de créer le plus facilement possible un grand nombre de fonctionnalités. Scott est également MVP Microsoft et co-auteur de nombreux livres et articles. N'hésitez pas à envoyer vos questions ou commentaires concernant cet article à l'adresse scott@swigartconsulting.com.

Liens utiles

Afficher:
© 2014 Microsoft