ZIPPER AVEC SHARPZIPLIB

KrocLeBo Messages postés 18 Date d'inscription jeudi 7 juin 2001 Statut Membre Dernière intervention 19 avril 2010 - 19 août 2004 à 07:35
kazaam Messages postés 14 Date d'inscription lundi 17 mars 2003 Statut Membre Dernière intervention 7 septembre 2010 - 2 avril 2008 à 14:19
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/25357-zipper-avec-sharpziplib

kazaam Messages postés 14 Date d'inscription lundi 17 mars 2003 Statut Membre Dernière intervention 7 septembre 2010
2 avril 2008 à 14:19
Bonne base mais avec des fichiers textes genre 1ko ca ne fonctionne pas
cs_agarawa Messages postés 8 Date d'inscription lundi 29 décembre 2003 Statut Membre Dernière intervention 2 août 2007
29 août 2007 à 11:09
Windows ne sais pas lire les fichiers généré par ton code.
Pour ça, il faut prendre en charge le calcul du crc (qui n'est pas fait automatiquement)

J'en profite par la même occasion pour donner un exemple dans lequel on peut creer une petite architecture de fichiers (je veux dire, mettre des dossiers dans le zip)

'source trouvée sur http://www.thescripts.com/forum/thread554580.html et posté par Chad.
' Je l'ai à peine modifié.


Imports System.IO
Imports ICSharpCode.SharpZipLib.Checksums
Imports ICSharpCode.SharpZipLib.Zip
Imports ICSharpCode.SharpZipLib.GZip


Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

' Try
Directory.SetCurrentDirectory("ton répertoire")
Dim objCrc32 As New Crc32()
Dim zos As ZipOutputStream

zos = New ZipOutputStream(File.Create("c:/test.zip")) 'yourzipfile()

' il faut mettre les noms relatifs pour que Windows puisse lire le fichier zip correctement (d'où la modif du currentdirectory)
Dim strFile() As String = {"fichier1.txt", "fichier2.doc", "images/fichier3.jpg"} 'vous créez votre tableau comme vous voulez, c'est juste un tableau...


For i As Integer = 0 To strFile.Length - 1 'on parcours le tableau, et pour chaque fichier,
'on l'insère dans dans notre zip (objet zos) avec la méthode Putnextentry, après avec ajouté la date de l'ajout, calculé la taille du fichier ainsi que le crc.


Dim strmFile As FileStream = File.OpenRead(strFile(i)) 'fichier i
Dim abyBuffer(CInt(strmFile.Length - 1)) As Byte 'buffer qui fait la taille du fichier (donc suffisamment grand, pas besoin de s'embeter à recréer un autre buffer)
strmFile.Read(abyBuffer, 0, abyBuffer.Length) 'on lit le fichier( en le mettant dans en mémoire dans le buffer : attention pour les gros fichier)
Dim objZipEntry As ZipEntry = New ZipEntry(strFile(i)) 'on créer à partir du fichier un objet ZipEntry
objZipEntry.DateTime = DateTime.Now
objZipEntry.Size = strmFile.Length
strmFile.Close() 'on a plus besoin du fichier, alors on libère la mémoire
objCrc32.Reset()
objCrc32.Update(abyBuffer)
objZipEntry.Crc = objCrc32.Value ' on calcul le crc
zos.PutNextEntry(objZipEntry) ' on insérer l'object ZipEntry (notre fichier quoi) au zip
zos.Write(abyBuffer, 0, abyBuffer.Length) 'on l'écrit
Next


zos.Finish()
zos.Close()

messagebox.show ("ok")

Catch ex As Exception
MsgBox(ex.ToString)
End Try
End Sub
stfou Messages postés 450 Date d'inscription samedi 16 avril 2005 Statut Membre Dernière intervention 18 avril 2007 3
9 mai 2006 à 17:41
OK merci
cs_god_like Messages postés 6 Date d'inscription mardi 18 novembre 2003 Statut Membre Dernière intervention 8 novembre 2004
8 mai 2006 à 22:50
De rien.
Donc non ça n'est pas copié collé. Je l'ai fait parce que, justement, je n'ai pas trouvé de code équivalent sur le net! ( Mais je ne dois surement pas être le seul !!!)

Comme je le disais plus haut à l'époque, j'ai utilisé le bout de code pour une appli à but d'archivage (un batch sur un serveur d'archivage). Les zip créés étaient ouverts par winzip.
D'ailleurs j'ai fait ça en stage et j'ai su il y a pas longtemps que l'appli était toujours utilisée !
stfou Messages postés 450 Date d'inscription samedi 16 avril 2005 Statut Membre Dernière intervention 18 avril 2007 3
8 mai 2006 à 20:19
Merci pour ce code, mais peut-être pas un peu copier collé ?^^:)
par contre, comment on fait pour dézipper ?
cs_Jackboy Messages postés 757 Date d'inscription vendredi 7 septembre 2001 Statut Membre Dernière intervention 19 juin 2008
9 sept. 2005 à 16:55
ok j'ai trouvé mon erreur, j'avais mis un \bin plus haut dans la hierarchie...

mais j'ai un trouble, je cree un zip, mais rien dedans !!! les 3 txt existent mais ne s'integre pas au zip ces pas pratique mettons !!!
cs_Jackboy Messages postés 757 Date d'inscription vendredi 7 septembre 2001 Statut Membre Dernière intervention 19 juin 2008
9 sept. 2005 à 16:45
erreur dans le code

Type 'ZipEntry' is not defined.

pour la var Dim MyZipEntry As ZipEntry

tu une idee je suis pas mal debutant en .net
cs_god_like Messages postés 6 Date d'inscription mardi 18 novembre 2003 Statut Membre Dernière intervention 8 novembre 2004
29 août 2005 à 16:52
Désolé je n'ai pas d'infos à donner pour le dézippage, mon application étant juste à but d'archivage et s'ouvrant avec winzip installé sur les postes de l'entreprise pour laquelle j'ai fait ça.
Mais il me semble avoir vu des infos sur ça dans la doc de developpement de sharpziplib (là où j'ai trouvé les infos pour mon bout de code)

bon courage
shopi972 Messages postés 1 Date d'inscription mardi 8 avril 2003 Statut Membre Dernière intervention 29 août 2005
29 août 2005 à 16:34
Bonjour,

Je suis en train de "m'amuser" avec la sharpzip lib et autant pour le zippage en GZ, Zip ou tar pas de blème mais pour le dézippage, là j'ai un sacré bug, donc si vous aviez éventuellement un exemple de code pour le dézippage via le sharpziplib ça serait vraiment cool

merci d'avance
Nicolas
cs_god_like Messages postés 6 Date d'inscription mardi 18 novembre 2003 Statut Membre Dernière intervention 8 novembre 2004
3 juil. 2005 à 21:40
Oui c'est vrai, merci de l'ajouter.
J'avais fait ça en stage l'année dernière et effectivement j'avais fait cette modification. Dans l'absolu ça ne pose pas de problème mais c'est vrai que c'est plus propre.
Content de voir que ma source est encore visitée :-)
cs_Delta33 Messages postés 1 Date d'inscription dimanche 3 juillet 2005 Statut Membre Dernière intervention 3 juillet 2005
3 juil. 2005 à 20:29
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
KrocLeBo Messages postés 18 Date d'inscription jeudi 7 juin 2001 Statut Membre Dernière intervention 19 avril 2010
21 août 2004 à 11:27
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_god_like Messages postés 6 Date d'inscription mardi 18 novembre 2003 Statut Membre Dernière intervention 8 novembre 2004
19 août 2004 à 10:35
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 ?
cs_god_like Messages postés 6 Date d'inscription mardi 18 novembre 2003 Statut Membre Dernière intervention 8 novembre 2004
19 août 2004 à 08:44
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.
KrocLeBo Messages postés 18 Date d'inscription jeudi 7 juin 2001 Statut Membre Dernière intervention 19 avril 2010
19 août 2004 à 07:35
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 ;)
Rejoignez-nous