Zipper avec sharpziplib

Soyez le premier à donner votre avis sur cette source.

Snippet vu 20 835 fois - Téléchargée 36 fois

Contenu du snippet

Voilà un code qui permet de zipper des fichier aprés avoir référencé la dll de SharpZipLib ( ICSharpCode.SharpZipLib.dll )telechargeable à http://www.icsharpcode.net/OpenSource/SharpZipLib/Default.aspx .
Je n'ai rien trouvé de comparable sur vbfrance alors j'ajoute ma contribution.
Le code n'est pas commenté, je viens juste de le faire ! c'est court mais ça fonctionne...

Source / Exemple :


Imports ICSharpCode.SharpZipLib.Zip
Imports System.io

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As 
System.EventArgs) Handles Button1.Click
        Dim MyZipEntry As ZipEntry
        Dim MyZipOutputStream As ZipOutputStream
        Dim MyFileStream As FileStream
        Dim buffer(4096) As Byte
        Dim count As Integer
        Dim i As Integer
        Dim Fichiers(2) As String

        Fichiers(0) = "c:\test.txt"
        Fichiers(1) = "c:\test2.txt"
        Fichiers(2) = "c:\test3.txt"

        MyZipOutputStream = New 
ZipOutputStream((File.Create("c:\test.zip")))

        MyZipOutputStream.SetLevel(5) ' Niveau de compression

        For i = 0 To UBound(Fichiers)
            If File.Exists(Fichiers(i)) Then
                ' Ouverture en lecture du fichier à zipper 
                MyFileStream = File.OpenRead(Fichiers(i))

                ' Enregistrement dans le zip de la référence du fichier 
d'entrée
                MyZipEntry = New 
ZipEntry(Path.GetFileName(Fichiers(i)))
                MyZipOutputStream.PutNextEntry(MyZipEntry)

                ' Lecture et zip du fichier par blocs de 4096 bytes
                count = MyFileStream.Read(buffer, 0, 4096)
                While (count > 0)
                    MyZipOutputStream.Write(buffer, 0, count)
                    count = MyFileStream.Read(buffer, 0, 4096)
                End While
            End If
        Next i

        MyFileStream.Flush()
        MyFileStream.Close()
        MyZipOutputStream.Close()
    End Sub

Conclusion :


ATTENTION : il faut que les fichiers test.txt existent... enfin ça on peut ajouter un test pour savoir...
Sinon je me suis inspiré de l'aide fournie avec la librairie téléchargée. ( exemple en C# )

... et juste pour dire que c'est la 1ere source que je met... j'espére qu'elle servira...

A voir également

Ajouter un commentaire

Commentaires

KrocLeBo
Messages postés
18
Date d'inscription
jeudi 7 juin 2001
Statut
Membre
Dernière intervention
19 avril 2010
-
Attention avec cette librairie, que j'ai utilisé pas mal de fois et j'en suis revenu.

1er Point : Le zipage :
- Ta source fonctionne, attention cependant à la taille des fichiers à zipper, sur de gros fichiers tu risques d'avoir des plantages mémoire.
Il est préférable de lire les fichiers par blocs de taille limitée plutot qu'en un seul coup. La lib réserve de l'espace mémoire physique du coup suivant la mémoire dispo tu risques de planter (c'est en tout cas ce que j'ai pu expérimenter en c#).

2nd point : Dézipage
- J'ai eu pas mal de problèmes d'incompatibilité sur certains fichiers zip, notemment les fichiers présentant un mode de compression 6 qui est très mal géré.

Enfin bref, c'est une bonne lib mais à utiliser après avoir fait beaucoup de tests.

Pour le zipage, pas trop de soucis, en prenant bien la précaution du premier point ;)
cs_god_like
Messages postés
6
Date d'inscription
mardi 18 novembre 2003
Statut
Membre
Dernière intervention
8 novembre 2004
-
Je te remercie pour tes conseils.
je n'ai pas encore pu tester sur de gros fichiers c'est pê pour ça que je n'ai pas encore eu ce problème mais à terme mon appli devrait servir pour de grosse masse de fichiers alors...
Si tu as un exemple qui pourrait m'expliquer comment lire et ecrire les fichiers par blocs de taille limitée je suis preneur.
merci d'avance.
cs_god_like
Messages postés
6
Date d'inscription
mardi 18 novembre 2003
Statut
Membre
Dernière intervention
8 novembre 2004
-
Je te remercie encore pour tes conseils KrocLeBo.
j'ai modifié la source.
J'avais testé sur des fichiers de 40 Mo et ça passait mais j'ai préféré prendre mes précautions !
Je voulais savoir si le dezippage posait problème pour winzip (ou autre) ou pour la dll sharplibzip ?
KrocLeBo
Messages postés
18
Date d'inscription
jeudi 7 juin 2001
Statut
Membre
Dernière intervention
19 avril 2010
-
Nickel pour la lecture par blocs :)
Pour le dézippage, j'ai rencontré quelques problèmes avec certains fichiers, mais à priori les fichiers générés par Winzip ou par la lib elle même passent bien.
Je te conseille de faire malgré tout quelques tests en générant toi même quelques fichiers zip (avec divers taux de compression, avec ou sans sous-repertoires etc..), je n'ai pas poursuivi très loin dans ce sens vu que dans mon cas j'ai du abandonner la lib au profit d'un utilitaire en ligne de commande...
Bon dev ;)
cs_Delta33
Messages postés
1
Date d'inscription
dimanche 3 juillet 2005
Statut
Membre
Dernière intervention
3 juillet 2005
-
après test du code, j'ai noté que la fermeture des fichiers à zipper ne devait pas se trouver en fin de procédure mais dans la boucle, ce qui donne :

Imports ICSharpCode.SharpZipLib.Zip
Imports System.io

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button1.Click
Dim MyZipEntry As ZipEntry
Dim MyZipOutputStream As ZipOutputStream
Dim MyFileStream As FileStream
Dim buffer(4096) As Byte
Dim count As Integer
Dim i As Integer
Dim Fichiers(2) As String

Fichiers(0) = "c:\test.txt"
Fichiers(1) = "c:\test2.txt"
Fichiers(2) = "c:\test3.txt"

MyZipOutputStream = New
ZipOutputStream((File.Create("c:\test.zip")))

MyZipOutputStream.SetLevel(5) ' Niveau de compression

For i = 0 To UBound(Fichiers)
If File.Exists(Fichiers(i)) Then
' Ouverture en lecture du fichier à zipper
MyFileStream = File.OpenRead(Fichiers(i))

' Enregistrement dans le zip de la référence du fichier
d'entrée
MyZipEntry = New
ZipEntry(Path.GetFileName(Fichiers(i)))
MyZipOutputStream.PutNextEntry(MyZipEntry)

' Lecture et zip du fichier par blocs de 4096 bytes
count = MyFileStream.Read(buffer, 0, 4096)
While (count > 0)
MyZipOutputStream.Write(buffer, 0, count)
count = MyFileStream.Read(buffer, 0, 4096)
End While
MyFileStream.Flush()
MyFileStream.Close()

End If
Next i

MyZipOutputStream.Close()
End Sub

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.