Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

ZIP - UNZIP : CLASSES POUR GÉRER VOS ZIPS


Information sur la source

Catégorie :Compression & Split Classé sous : zip, unzip, classe, compression, compresser Niveau : Débutant Date de création : 27/06/2004 Date de mise à jour : 25/01/2008 20:49:30 Vu / téléchargé: 21 720 / 3 905

Note :
9 / 10 - par 18 personnes
9,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (67)
Ajouter un commentaire et/ou une note


Description

Cliquez pour voir la capture en taille normale
Les classes originales sont de Mc Millan dont le lien est fourni dans le Zip.
J'ai repris ces classes et je les ai modifiées afin de pouvoir gérer les fichiers Zip plus facilement. J'y ai ajouté aussi des commentaires afin de mieux comprendre le principe.
Les zips fabriqués sont compatibles avec les Zip standards - y compris les accents, voir mise à jour du 12/6/06
Les classes utilisent la librairie ZLib.dll qui est beaucoup plus pratique que les Zip.dll et Unzip.dll
Le fichier ZLib.dll est inclu dans le zip, mais aussi dans la ressource du projet : comme ça, si le fichier disparait, on peut le recréer facilement.

Voyez les applis de démo fournies avec : Leur utilisation est assez simple.
 

Conclusion

J'avais besoin de cet ensemble de gestion de Zip pour compresser un ensemble de fichiers pour sauvegarde.
Ce qu'il manque :
- Gestion de l'ajout de fichier dans un Zip existant
- Gestion de la suppression de fichier dans un Zip existant
tout simplement parce que je n'en avais pas besoin et aussi parce que c'est assez coton à gérer.

 

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Historique

27 juillet 2004 19:01:50 :
Contrairement à ce que j'expliquais dans la source, le fichier DLL doit se trouver dans un répertoire accessible par le Path, donc par exemple, sous %WIN%\System32 Sinon, l'utilisation de l'option "RelativePath" ne fonctionne pas. Cette version modifiée extrait donc le fichier DLL dans ce dernier répertoire.
27 juillet 2004 19:36:18 :
.
12 juin 2006 04:35:42 :
Ca y est : Après un week-end complet à travailler sur le sujet, les noms des fichiers Zippés sont maintenant compatibles avec les accents ! La vache, pas facile de trouver les infos ... même que je ne les ai pas vraiment trouvées ... En fait, c'est une histoire de page de codes : VB utilise des caractères numérotés en ISO 8859-1 (Latin 1 occidental) Or, les noms des fichiers utilisés sous WinZip par exemple, utilisent l'ASCII étendu. Les caractères accentués ne se trouvent pas au même endroit (code ascii change) Je n'ai pas trouvé l'astuce pour convertir proprement les index de ces caractères, je me suis fait ma propre table de correspondance. D'autant que, et c'est troublant, des fois WinZip utilise le codage ISO quand même. Afin, le principal, c'est que ça fonctionne now.
12 juin 2006 14:35:52 :
Correction : Le chemin complet (avec l'option du même nom) comportait le nom du disque, ce qui est interdit dans la norme des Zip.
18 septembre 2006 01:57:26 :
Fiabilisation conversion Ascii <-> Ansi pour ne plus avoir de problème avec les caractères accentués sous WinZip. (merci EBartSoft)
17 septembre 2007 15:19:25 :
Modif suggérée par PNEAU : Réécriture de la date et heure d'un fichier extrait
17 septembre 2007 15:26:02 :
Pendant que j'y étais, j'a aussi appliqué la modif suggérée de YAN35 à propos de la lecture des fichiers de taille nulle
25 janvier 2008 20:49:31 :
Correction d'une erreur dans la classe clsZip_UnZip, procédure zExtractFile : On faisait référence au LocalFileHeader alors qu'il faut regarder le CentralFileHeader (cas des compression de type 8) Ceci explique surement quelques problèmes signalés.

Commentaires et avis

signaler à un administrateur
Commentaire de EBArtSoft le 27/06/2004 20:44:32 administrateur CS

Une reference a zlib c'est bien,
compiler la zlib avec le projet vb c'est encore mieu ;)

(comming soon...)

@+

signaler à un administrateur
Commentaire de Arknoth le 28/06/2004 12:08:46

Décidément la librairie de compression de Jean-Loup Gailly est de plus en plus populaire. Cette dll est un must (pour info elle est utilisée par la plupart des sociétés de développement de jeux vidéos style Blizzard)

@ pluche

signaler à un administrateur
Commentaire de bubble44 le 01/07/2004 19:40:45

Je me demande si ca saurait decompresser les "GZIP Content-Encoding in HTTP responses"

en gros certaines demandes http, ou le truc retourné est tout compressé.
J'ai jamais trouvé une source en vb.

signaler à un administrateur
Commentaire de jack le 01/07/2004 23:55:37 administrateur CS

Salut bubble44
Regarde bien dans ces classes et tu verras qu'il ne s'agit que de dé/compresser des chaînes de caractères.
Si la méthode de compression de GZip est la même que celle de Zip, tu peux très bien utiliser cette DLL et ces classes pour faire de la dé/compression à la volée.

signaler à un administrateur
Commentaire de EBArtSoft le 02/07/2004 08:32:38 administrateur CS

bubble44&gt; Aller je te prepare un "tutorial" rien que pour toi ;)

signaler à un administrateur
Commentaire de bubble44 le 02/07/2004 10:37:03

D'accord, j'attends de voir alors ...

signaler à un administrateur
Commentaire de jack le 20/08/2004 18:31:25 administrateur CS

Dédé me demande :

Super tes classes, je vais en avoir besoin.
Cependant :
  - est-ce normal que je fichier zip contienne un dossier "C:" ?
  - est-ce que les classes fonctionneront avec des gros fichiers (env 600-700Mo) ?
  - est-ce possible de mettre une barre de progression ?

Merci d'avance
----------------------------------------------------------------------
-1- Comme dit dans les explications, ces classes originales ne sont pas de moi. Voir lien vers les originaux dans le Zip.
-2- Dossier "C:" : Je ne sais pas, de toute façon, ça ne change rien à la décompression
-3- Fonctionne avec des gros fichiers : Personnellement, je compresse 53 Mo, 1200 fichiers textes sans problème. Il va falloir que tu essayes toi même !
-4- Barre de progression : Non, je ne pense pas car le zippage se fait en deux étapes : la collecte des noms de fichiers, puis la compression/création du ZIP. Or pendant cette dernière phase, la DLL ne renvoie pas d'info.

La prochaine fois, évite les messages privés. Merci
Jack

signaler à un administrateur
Commentaire de thierrydelepine le 10/09/2004 18:16:11

Bonjour,

j'utilise ta classe pour visualiser le contenu de fichier ZIp et pour extraire certains fichiers.
Cela fonctionne très bien avec des ZIP dit standard.
Par contre avec des ZIP fait par Java (Sun ne respecte pas le standard ZIp et a priori met les tailles compressés en fin de fichier) ou des JAR cela ne marche pas.
As tu une solution, JACK ?

merci de ta reponse.

signaler à un administrateur
Commentaire de jack le 10/09/2004 18:47:04 administrateur CS

Salut Thierry
Non, désolé, pas de soluce ... je ne suis pas un expert des formats de compression.
----------------------------------------------------------------------------------
Pour info, il y a un bug que je n'ai pas réussi à faire disparaître :
Lorsqu'on ZIP avec cette classe des fichiers et des répertoires comportant des lettres accentuées, le UnZip avec la classe marche parfaitement, par contre, un dézippage avec WinZip par exemple ne restitue pas ces caractères correctement.
Vala

signaler à un administrateur
Commentaire de Danyz le 13/01/2005 08:02:19

Salut Jack, merci pour le travail ;)
ca m'a grandement été utile !

Juste une petite precision pour ceux qui vont prendre ta source , je vien de passer 2 heures a m'arracher les cheveux avec les chemins relatifs (qui marchaient de facon aléatoire).
en fait il suffit de placer un Chdir (App.Path) avant de faire le zip et ca marche impecable. En fait j'utilisais une boite de dialogue et ca changait le repertoire courant...
et aussi si vous voulez zipper plusieurs fois d'affiler penser a rajouter un Set MonZip = Nothing sinon il garde les fichiers du zippage d'avant :)

Sinon il y a une possibilité de rajouter un progressbar ?
j'ai vu ta reponse juste au dessus , mais ca serait pas possible de faire un progressbar basé sur le nombre de fichiers ( genre il renvoit le nombre de fichiers deja zippé a chaque nouveau fichier) c'est sur que si tu zip 200 fichiers de  1Ko et le dernier fait 200 Mo , tu vas resté longtemps sur le 99 % , mais moi j'en aurait l'utilité. (je zip une grosse quantité de fichiers de meme taille)

Merci ;)

signaler à un administrateur
Commentaire de Fanny12 le 20/06/2005 14:32:14

Bonjour,
Merci pour ta source. C'est la seule du site qui marche exactement comme je veux, j'ai juste fait une petite modif pour garder l'arborescence que je veux.
Petit bémol, les fichiers zip générés ne sont pas compatibles avec l'outil Dossiers compressés de Windows XP, il n'affiche rien.

signaler à un administrateur
Commentaire de jack le 23/06/2005 17:49:29 administrateur CS

Merci à tous pour vos messages

Salut Fanny12
Ok pour l'info. Je n'ai pas pu le tester personnellement sous XP

Salut Danyz
Si le fichier ZLib.DLL est stocké et registré sur le répertoire System32, il ne devrait pas y avoir de soucis avec les répertoires relatifs - je me suis cassé la tête aussi un moment pour que ça fonctionne.
Exact pour le 'Set monZip = Nothing' : C'est une règle de programmation de suprimer la déclaration des objets avant de sortir d'une procédure.
En ce qui concerne la ProgressBar : Oui, c'est faisable. Voici les bases (pas le temps de mettre à jour).
- dans la partie déclaration ta classe, ajoute
Public Event Progression(ByVal Pourcentage As Long)
- dans le code de la classe, aux endroits opportuns, calcule le % à renvoyer à la forme d'acceuil et donne lui la valeur :
RaiseEvent Progression(LaValeurCalculée)
- dans la forme d'acceuil, la déclaration de la classe change : Il faut ajouter le WithEvents :
Private WithEvents MonZip  As ZipClass
- Si tu regardes parmi les controles de la forme d'acceuil, tu as maintenant un objet 'MonZip' et un évènement 'Progression' : Cet evènement se déclenchera à chaque fois que tu feras le 'RaiseEvent' dans la classe. Il te suffit de faire un :
maProgressBar.Value = Pourcentage
Pense à ajouter des DoEvent après un RaiseEvent afin que Windows ait le temps d'envoyer les infos

signaler à un administrateur
Commentaire de Fanny12 le 24/06/2005 09:13:06

Salut !
Je me suis rendue compte que c'était aléatoire avec l'outil Dossiers compressés de Windows XP. Il affiche le contenu du fichier zip une fois sur deux.

Voilà

signaler à un administrateur
Commentaire de abdebr le 19/07/2005 02:30:08

Salut,
je travaille actuellement sur un projet pour lequel je vais avoir besoin de zipper d'énormes fichiers.

Ta Dll permet-elle de gérer la création de zip avec une taille max, encre mieux, permet-elle de créer plusieurs zip si la taille des fichiers à compresser est supérieure à un seuil prédéfinit ? le but de cette question est de pouvoir gérer la création de CD documentaires en zippant les fichiers pour gagner da la place.

Par contre, j'aurais une dernière pette question :
est-il possible de visualiser le contenu d'un zip avec la dll et peut-on visualiser un des fichiers "à la volée" sans dézipper ?

merci de ton aide
En attendant, je vais me pencher sur tes sources.

signaler à un administrateur
Commentaire de jack le 19/07/2005 18:00:49 administrateur CS

Salut Abdebr
Non, la source proposée ici ne permet pas de limiter la taille du fichier final, mais en se penchant dessus, c'est surement faisable. Par contre, il s'agira de fichiers ZIP distincts, non chainés.
L'autre possiblité consisterait à crééer le zip complet et de le couper (spliter) en plusieurs fichiers mais qu'il faudra réunir à nouveau pour le dézipper.

Visualiser à la volée : de toute façon, il faut dézipper à un moment donné. Regarde la source, tu peux choisir de ne dézipper qu'un seul des fichiers si tu le désires, de là, facile à afficher ensuite.

Nota : Plutôt que de l'utiliser en DLL, tu peux simplement placer les classes dans ton projet = plus facile à gérer.

signaler à un administrateur
Commentaire de rafanel le 19/09/2005 11:43:54

j'ai utlise ce code pour réaliser on ziper mais voila si on zip un fichier trop grop on a une erreur N°7 Memoire insufisante....
comment résoudre ce pb?
l'erreur vient qu'on cré en ram un tableai bimaire equivalent a la taille du fichier dans le module compressbit. pourrait t'on par faire un fichier temporaire éuivalent a ce tableau. mais voila je ne suis pas une lumière du vb.
Alors si vous avait une solutin je suis prenneur.
merci d'avance.

signaler à un administrateur
Commentaire de philheiz le 13/10/2005 13:35:47

beau boulot jack !
enfin une classe facile à utiliser. Ca m'étonne toujours qu'il n'y ait pas plus de sources utilisables (comme celle-ci) lorsqu'il s'agit de zipper.

signaler à un administrateur
Commentaire de shaiinna le 25/10/2005 11:39:57

ben moi perso ca marche po snoufff

Les commandes zipopen nexiste pas c openzip pi en plus

If not Monzip.OpenZip then Monzip.OpenZip (nomdufichierzip)

Call MonZip.ExtractallFiles ("chemin destination", true, false)

End if

End sub

BEn ca marche pas les valeurs ne sont pas defini pourtant dans la cls elles le sont

i don't understant why ??????? ca marche pas !!!
Bourdel lol
ptite aide?

signaler à un administrateur
Commentaire de jack le 25/10/2005 18:19:26 administrateur CS

Salut Shaiina
Désolé, mais je pense que ces différences viennent du fait que tu n'utilise pas la DLL ZLib fournie avec le projet.
Méfie toi, il existe plusieurs versions de cette DLL et toutes ne fonctionnent pas !
Cette DLL est fournie dans les ressources de l'application "DémoZip".
Alors il te suffit de lancer cette appli pour qu'il place la DLL dans le répertoire %Win%\System32.
Je viens de vérifier, j'ai commis des erreurs que je corrigerai dans les prochains jours :
- Dans le projet "DémoUnZip", j'ai mis le code mais j'ai oublié de mettre la DLL dans un fichier de ressources.
- Dans ce même projet, je teste si la DLL est sur le répertoire de l'application : erreur, il faut la mettre (donc tester sa présence) sous System32
- Pour être bien, il faudrait que le programme teste aussi la version de la DLL pour vérifier la compatibilité.

Je n'est pas tout testé, mais il est possible que cette extraction d'une DLL ne soit pas possible si tu n'es pas Administrateur de ton poste.

signaler à un administrateur
Commentaire de shaiinna le 26/10/2005 09:28:05

justement ah oui bjr tout dabord hihihih jack

La dll je ne peut pas la mettre autre part que sur le systeme justement je n'y ai pas acces enfin les utilisateurs n'auront pas acces au systeme dont lenvoie de ma dll labas ca ne passera pas

Et une question au passage un *.db confirme moi cela n'est jamais en lecture seule? parceque je ne peux pas ecraser mon fichier je peux le delete mais pas le copier.

je sais que ce n'est pas le sujet ici mais j'en profite un peu :p

Bye bye

signaler à un administrateur
Commentaire de jack le 26/10/2005 18:59:45 administrateur CS

Salut
Si tu ne places pas la DLL sous System32, le zippage de données issues d'un autre répertoire / disque que le répertoire courant risque de ne pas fonctionner. A moins de placer ce répertoire dans le Path sous DOS.
Fichier .db : connais pas

signaler à un administrateur
Commentaire de sarl_adc le 31/10/2005 15:47:27

Merci pour ces sources facilement réutilisables et faciles à comprendre :-)

signaler à un administrateur
Commentaire de shaiinna le 31/10/2005 17:20:29

Excusez moi mais comment as tu fait pr compiler ton exe avec ta dll...
Merci pour ta reponse

signaler à un administrateur
Commentaire de Danyz le 31/10/2005 17:50:20

les *.db sont des fichiers systeme de windows (en rapport avec les images, je sais pas trop comment ca marche) : Thumbs.db
On peut les voir en affichant les " Fichiers protégés du systeme d'exploitation", dans les options d'explorer.

++

signaler à un administrateur
Commentaire de shaiinna le 31/10/2005 18:02:46

et pour la compilation de la dll dans lexe comment quon fait

signaler à un administrateur
Commentaire de jack le 31/10/2005 19:23:10 administrateur CS

Danyz : Pour tes fichiers *.db, pose la question sur le forum. Ce n'est pas ici que tu trouveras la réponse.
Shaiinna : La DLL est stockée dans le fichier Ressource du projet.
Pour insérer des fichiers (quelconque) dans un fichier ressource, il suffit d'utiliser le gestionnaire de Ressouce = petite icone verte de cubes imbriqués. Si tu ne le vois pas dans ta barre de VB6, vas l'activer dans le menu Option, Gestionnaire de compléments.
Pour extraire un fichier de la ressouce, ... il suffit de lire le programme.
Le fichier ressource se trouve compilé avec l'EXE, donc facile à transporter.

signaler à un administrateur
Commentaire de Danyz le 31/10/2005 19:24:53

"Et une question au passage un *.db confirme moi cela n'est jamais en lecture seule? parceque je ne peux pas ecraser mon fichier je peux le delete mais pas le copier."

"Fichier .db : connais pas"

c'etait juste pour info....

signaler à un administrateur
Commentaire de Danyz le 31/10/2005 19:28:27

lol t'as du editer ton message entre temps...

ps : c pas moi qui pose la question :)

signaler à un administrateur
Commentaire de rafanel le 02/11/2005 08:06:36

j'ai utlisé ce code, mais voila si on zip un fichier trop gros on a une erreur N°7 Memoire insufisante....
comment résoudre ce pb?
merci par avance.

signaler à un administrateur
Commentaire de shaiinna le 02/11/2005 09:27:34

Coucou tout le monde coucou jack comment va aujourd'hui

Dis moi j'ai tenté de rajouter donc ma dll comme tu me l'as indiqué complement ect

Cependant quand je tente de le lancer sans la dll sur la clé usb ca marche toujours pas

Aurais tu une idée du pourquoi du comment

Thanks everybody

signaler à un administrateur
Commentaire de jack le 02/11/2005 18:05:35 administrateur CS

Salut Shaiinna
Clé USB ? Là, tu cherches les emmerdes, avec une app VB6.
"Ca marche pas" ne veut rien dire.
Si tu as un code de défaut, ou si le programme s'arrête sur une instruction, dis-le, on n'est pas devin.
Je l'ai déjà dis et je répète : ne place pas la DLL sur le répertoire courant mais sous %Win%\System32
Pour extraire la DLL, c'est dans le projet démo du ZIP.

signaler à un administrateur
Commentaire de shaiinna le 02/11/2005 18:18:09

Bonsoir jack

Ne t'enerve pas oulaaa

moi aussi je l'ai deja di je n'ai pas acces de par mes instructions a sys32 sinon tu penses bien que je l'aurais fait.

Mais je ne peux pas.


Donc vala vala

excuse moi du ca marche pas je comprends

Ciao

signaler à un administrateur
Commentaire de Jomba le 05/04/2006 09:59:09

C'est génial, j'ai pu l'intégrer à mon appli sans aucun problème. le code est super bien expliqué tout au long de la prcédure, ce qui permet desavoir exactement ce qui se passe et supprimer ce dont on a pas besoin.
ça mérite une super bonne note.

Jomba

signaler à un administrateur
Commentaire de jack le 06/04/2006 20:45:12 administrateur CS

Salut Jomba
Désolé, ton commentaire à disparu (fausse manip de ma part)
Tu disais avoir une erreur 52 "Nom ou numéro de fichier incorrect" lorsque tu tentes de zipper un fichier MDB en cours d'utilisation.

Bizarre. Au pire, tu aurais eu une erreur 70 "permission refusée", j'aurai compris, mais 52, je ne comprends pas.
Il faudrait debuger ton appli :
Menu Outils, Options, onglet Général : "Arrêt sur toutes les erreurs"
Quand le programme s'arrête sur cette erreur, il faudrait regarder :
- quelle est la ligne sur laquelle apparait l'erreur
- Si un nom de fichier en fait partie, regarder le nom du fichier (dans la fenêtre debug, tape :
? NomDeLaVariable
... et vérifie que ce fichier existe bien.

Je pense en fait que la liste des fichiers est préparée et le zippage a lieu quelques secondes plus tard ... et le fichier a disparu.
S'il s'agit du fichier "maDB.ldb", c'est fort possible.
A toi de filtrer les noms de fichier au moment de la préparation de la liste.

signaler à un administrateur
Commentaire de Jomba le 07/04/2006 08:55:17

Justement, je filtre les noms afin de ne pas prendre le .ldb.
Au moment où on met le fichier à compresser dans l'objet ZipClass, y a pas de probleme et c'est au moment où l'on tente de le compresser pour créer le zip que l'erreur se produit.
ça donne l'impression que le changement de la taille du fichier .mdb change aussi la façon dont il est localisé et que c'est pour ça que l'erreur est "Nom ou numéro de fichier incorrect".
et ça ne vient pas de mon appli puisque j'ai testé avec ce que tu as fait, je n'ai rien changé d'autre que les fichiers à compresser. à part cette erreur qui est difficile à prévoir, tout le reste fonctionne impecablement et est très facile à intégrer à sa propre appli.
je te dis bravo et merci pour ton aide.

Jomba

signaler à un administrateur
Commentaire de jack le 07/04/2006 19:04:40 administrateur CS

Idée en passant : Fais une copie du fichier et compresse la copie qui ne changera pas entre temps.

signaler à un administrateur
Commentaire de robek le 31/05/2006 10:59:15

Merci pour cette source !
Par contre, j'ai l'impression qu'il ne gère pas les noms de fichiers avec accents.

signaler à un administrateur
Commentaire de jack le 31/05/2006 19:11:07 administrateur CS

En effet, les noms de fichiers et de répertoires avec accents sont mal reconnus par un dézippeur commercial genre WinZip.
Par contre, il n'y a pas de problème si tu dézippes aussi avec cette classe.
Je n'ai pas eu le temps d'approfondir le problème. Surement une histoire d'unicode.

signaler à un administrateur
Commentaire de robek le 01/06/2006 10:55:40

J'ai essayé de dézipper ta source et le fichier "Démo_Zip.vbp" devient "D‚mo_Zip.vbp"
Je vois pas d'ou ça peut venir.

signaler à un administrateur
Commentaire de jack le 01/06/2006 17:46:09 administrateur CS

... Quel dézippeur utilises-tu ?
Personnellement, j'utilise le freeware AlZip sans aucun problème.
Si tu parles de dézipper ce fichier Zip de la source avec ma classe, je n'ai pas essayé.
Il est possible qu'il ne reconnaisse pas les accents (comme dit plus haut).
Par contre, si tu 'zip' avec la classe et que tu 'dézip' aussi avec la classe, tout fonctionne.

signaler à un administrateur
Commentaire de jack le 12/06/2006 04:36:39 administrateur CS

12/6/06 @@@@@@@@@@@@@@ Mise à jour classes (accents) @@@@@@@@@@@@@@@@@@@@

signaler à un administrateur
Commentaire de yan35 le 12/06/2006 20:04:36

Merci pour cette classe très interessante et que je vais utiliser. Je éventuellement y faire quelques modif et je les renverrai. Merci pour la documentation et le travail que ça représente.

signaler à un administrateur
Commentaire de yan35 le 13/06/2006 14:59:36

Bonjour,
Dans ta dernière version de cette classe, tu as supprimé la possibilité de stocker le disque du chemin des fichiers à zipper. Cependant l'enregistrement du nom du disque serait interessant, pour moi, lorsqu'il est formaté en UNC. Je vois que tu as modifié le paramètre : GeneralPurposeBitFlag de 2 à 0. Est-ce celui qu'il faut mettre à jour pour gérer ou pas les chemins complets ? Si oui 2 et 0 correspondent à quoi ?
Encore Merci pour ton code.

signaler à un administrateur
Commentaire de jack le 13/06/2006 23:28:24 administrateur CS

Salut
Non, le 2 en 0 est un simple flag. Je l'ai repassé à 0 comme le fait WinZip. Je n'ai plus en t^te ce qu'il représente, mais c'est anodin.
Oui, quand je parle de disque, j'ai supprimé le nom du disque local, celui qui commence par le traditionnel C:.
Donc les appellations UNC ne sont pas concernées (à tord, je pense)

signaler à un administrateur
Commentaire de yan35 le 14/06/2006 23:49:02

Bonsoir,

Il m'est arrivé un bugg tout bête dans CompressBytes.
Dans 1 liste de fichiers *.htm à comprimer, j'avais 1 fichier de taille 0 octet.
Oui, c'est rare, quasiment introuvable et c'est pas la peine de le comprimer, mais ça peut arriver dans des répertoires en récursif ! (ici documents ans settings\ ....\application Data\ ...\0000015.htm sans doute un fichier test !...) Peu importe, il y a plantage au niveau du Redim, forcément :
...
    fh = FreeFile
    Open FilePath For Binary As #fh
    FileSize = LOF(fh)
    
    ReDim FileData(FileSize - 1)
    Get #fh, , FileData
    Close #fh
...

J'y ai donc ajouté :
    Open FilePath For Binary As #fh
    FileSize = LOF(fh)
    
    If FileSize > 0 Then
        ReDim FileData(FileSize - 1)
    Else
        ReDim FileData(0)
    End If
    
    Get #fh, , FileData
    Close #fh

Cordialement.

signaler à un administrateur
Commentaire de jack le 15/06/2006 19:10:40 administrateur CS

Salut Yan35
Merci de cette info.
Ok pour ta solution.
Reste à tester ce qui se passe lors du dézippage ... (pas eut le temps de tester)

signaler à un administrateur
Commentaire de jack le 18/09/2006 02:04:19 administrateur CS

@@@@@@@ Remise à jour conversion Ascii <> Ansi, plus fiable @@@@@@@
(merci EBartSoft)
Les fichiers Zip peuvent contenir des fichiers/répertoires avec accents, compatible WinZip.

signaler à un administrateur
Commentaire de rafanel le 05/10/2006 11:15:53

salut jack

je viens utilisé ton exemple pour comprendre comment fonctionne la Zlib.dll
tout fonctionne trés bien, sauf si dans la liste des fichier il y a un fichier plus de 600 Mo il y a une erreur dans la fonction CompressBytes.
pourquoi ? ou alors comment courtourner le pb.
merci par avance
TR

signaler à un administrateur
Commentaire de kerriencpp le 13/10/2006 14:17:40

Bonjour,
Il semblerait que la correction proposée par Yan35 ne fonctionne pas, si on utilise winrar pour dézipper, les fichiers de taille 0 octet ne peut pas être décompressés car ils sont corrompus.

J'ai écris ceci à la place et je n'ai pas d'erreur pour dézipper à partir de winrar :

Private Sub CompressBytes(ByVal vsFilePath As String, ...
...
Open vsFilePath For Binary As #llfh
llFileSize = LOF(llfh)
If llFileSize = 0 Then
  Close #llfh
  Exit Sub
Else
  ReDim FileData(llFileSize - 1)
End If
Get #llfh, , FileData
Close #llfh
...

Par contre il y a toujour un problème pour décompresser les fichiers de taille 0 octet à partir de la classe "clsZip_UnZip.cls". Je vais essayer de creuser un peu plus la question.
Cordialement.

signaler à un administrateur
Commentaire de ghuysmans99 le 07/11/2006 21:34:57

ca marche du tonnerre !

signaler à un administrateur
Commentaire de yan35 le 19/11/2006 20:38:00

Jack, je me suis permis d'implémenter tes classes que je trouvais Super, mais je préférais n'avoir qu'une classe à intégrer dans un projet et je voulais aussi pouvoir gérer des zip de grande taille.
Ceci m'a conduit à changer un peu le concept de ta source.
Voici le lien de ma classe qui part des tiennes, ta dernière version diffusée à ce jour intégrée.
http://www.vbfrance.com/code.aspx?ID=40387
Merci de ton avis.

signaler à un administrateur
Commentaire de jack le 19/11/2006 21:11:18 administrateur CS

Très bonne initiative, Yan
Merci pour tout le monde

signaler à un administrateur
Commentaire de EBArtSoft le 19/11/2006 21:14:30 administrateur CS

Tu peux supprimer les references a zlib avec ceci : http://www.1activeserverpagesstreet.com/vb/scripts/ShowCode.asp?txtCodeId=58473&lngWId=1

Remplace aisement compress/decompress

@+

signaler à un administrateur
Commentaire de ankou22 le 16/04/2007 11:07:44

Bonjour,

J'ai le même problème que RAFANEL, lorsque je veux zipper un fichier de plus de 1Go, j'obtient une erreur "mémoire insuffisante" dans la proc CompressBytes(), au niveau de la ligne

ReDim FileData(FileSize - 1),

Si vous avez une idée, merci d'avance...

signaler à un administrateur
Commentaire de pneau le 17/09/2007 10:31:16

Salut à tous,
Lors de la décompression des fichiers, la date du fichier d'origine était perdue... ce qui me posait quelques soucis. J'ai donc modifié la classe pour réécrire la date dans le fichier décompressé.
Le code suivant a été ajouté...
Private Sub zSaveFile(ByVal Path As String, _
                      ByRef Data() As Byte, lLastDate As Integer, lLastTime As Integer)
   Dim FFileDateTime As FILETIME
   Dim hFile         As Long
   Dim retval        As Long
   Dim lfh           As Long
  
   DosDateTimeToFileTime CLng(lLastDate), CLng(lLastTime), FFileDateTime
    ' Sauvegarde les données dans le fichier
   lfh = FreeFile
   Open Path For Binary As #lfh
      Put #lfh, , Data
   Close #lfh
   hFile = CreateFile(Path, GENERIC_READ Or GENERIC_WRITE, FILE_SHARE_READ, ByVal CLng(0), OPEN_EXISTING, FILE_ATTRIBUTE_ARCHIVE, 0)
   If hFile <> -1 Then
      retval = SetFileTime(hFile, FFileDateTime, FFileDateTime, FFileDateTime)
      retval = CloseHandle(hFile)
   End If
End Sub

sur ce ...
@+
Tchô

signaler à un administrateur
Commentaire de jack le 17/09/2007 14:31:15 administrateur CS

Pas mal, merci.
C'est vrai que je n'avais pas fait attention à ce détail.
Et pour compléter, il faut appeler zSave avec les compléments d'info Heure et Date contenues dans CentralFileHeader.
Je mets à jour la source avec ta modif.
Merci d'avoir partagé.

signaler à un administrateur
Commentaire de ZedMaTrix le 05/10/2007 14:38:36

Hello,

Je vient d'étudier ta source, et sa marche bien.
Seule truc. Il n'est pas possible de faire rajouter à un zip existant des fichiers ?

Merci pour le super taff ! :)

signaler à un administrateur
Commentaire de jack le 05/10/2007 19:25:36 administrateur CS

Salut
Oui, surement Zed, il n'y a rien qui l'empèche.
-1- Réunir dans un même projet les deux projets présents ici.
-2- Ouvrir le zip existant avec la classe UnZip qui relit d'abord la structure du fichier.
-3- Il doit suffire ensuite d'appliquer les méthodes Zip.
Je n'ai hélas pas le temps d'essayer (et je n'ai pas eu besoin de cette fonctionnalité), mais le code est bien commenté, plonge toi dedans.

signaler à un administrateur
Commentaire de ZedMaTrix le 08/10/2007 11:20:32

Tu croix que c'est comme ca que ca marche ?
Il décompresse tout, et re-compresse avec le(s) nouveau(x) fichier(s) ?

Ça me parait bisard, mais bon, d'un autre coté, je n'y connais rien en compression coté dev.

signaler à un administrateur
Commentaire de jack le 08/10/2007 21:53:18 administrateur CS

Promis, si j'ai du temps, je ferai une mise ç jour avec cette fonctionnalité, mais ne soit pas pressé (pas avant fin novembre sauf miracle).
Je te tiens au courant.

signaler à un administrateur
Commentaire de ZedMaTrix le 09/10/2007 10:08:33

Merci à toi JACK !

Mais je trouve énorme ce fonctionnement... ( J'ai fait des recherches, et effectivement, il faut tout extraire pour tout re-compresser. J'ai même fais des tests... )

C'est quand même dingue que le système soit tellement pourris...

Y a pas un autre format que zip qui lui soit mieux construit, et donc permet l'ajout de fichier sans tout ressortir de l'archive ?

signaler à un administrateur
Commentaire de jack le 09/10/2007 18:01:59 administrateur CS

Je vais m'avancé, mai je ne pense pas qu'il faille tout décompresser, non.
La structure d'un fichier Zip est propre :
- Des entêtes de caractéristiques dans laquelle on retrouve les infos des fichiers qu'il contient et notamment la taille compressée.
- Une fois qu'on a la taille de cette zône de données compressées, je pense qu'il est simple de se placer derrière pour en ajouter d'autres, ce n'est qu'un jeu de déplacement (Seek) dans les données du fichier.

Je verrais ça en détail quand je ferai la mise à jour

signaler à un administrateur
Commentaire de ZedMaTrix le 10/10/2007 09:11:17

OK merci Jack ! ;)

signaler à un administrateur
Commentaire de slayer le 09/01/2008 01:02:32 10/10

cool , cette source , good joob .
juste une petit question , comment mettre un mot de passe au zip ?

signaler à un administrateur
Commentaire de jack le 09/01/2008 08:25:13 administrateur CS

Bonne question.
Je n'ai pas la connaissance pour te répondre.
Cette source ne fait que reproduire le format d'un fichier ZIP, mais je ne me rappelle pas avoir vu de description de cette option dans la structure originelle.
Je regarderai quand j'aurai 5 minutes (pas tout de suite)

signaler à un administrateur
Commentaire de gmni le 27/04/2009 16:54:19 8/10

Excellente source, sauf quand on dezip une source déjà compréssée (par 7z par ex) les dossiers vides ne sont pas reconnus.
Ya t'il qq part un paramètre à modifier ou rajouter ??

signaler à un administrateur
Commentaire de jack le 27/04/2009 20:01:26 administrateur CS

Pas fait gaffe à ce "détail".
Faudrait regarder en mode debug ce qu'on trouve lorsqu'il s'occupe de la structure vide.
Désolé, pas le temps d'approfondir.

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

Problème Compression zip [ par Taurus67 ] Bonjour, je fait un petit logiciel qui doit compresser en zip des demos (.dem) ( counter strike ) une fois que celle ci ont fini d'&#234;tre enregistr Contrôle OCX pour compresser en ZIP [ par Matt2k ] Je développe actuellement pour les besoins de mon site internet un programme qui compresse tous les fichiers d'un répertoire dans des fichiers .ZIP (u OCX pour compresser en ZIP [ par Matt2k ] Je développe actuellement pour les besoins de mon site internet un programme qui compresse tous les fichiers d'un répertoire dans des fichiers .ZIP (u Algorithme de compression (ZIP RAR ACE....) [ par Fildomen ] Salutje veux me lancer dans un prog de compression, masi je ne trouve pas de doc, s'il vous plait passez moi un lien sur les algorihmes de n'importe e Comment compresser(.zip) des fichiers, a partir de mon programme !!!!;( [ par wico2002 ] Salut, Je fais un programme de "back-up" pour une sauvegarde rapide, Mais j'aimerais pouvoir le mettre dans un .zip et que ca soit compresser Compresser un fichier en .zip [ par Morgul ] J'aimerai savoir si c'est possible de compresser un fichier a partir de VB et ke ce soit en zip? Si oui comment ? MerciMo®gul Compression / décompression [ par nicolasheurtevin ] Bonjour, J'ai quelques petits soucis apr&#232;s avoir essay&#233; diff&#233;rents bouts de code permettant la compression zip et la d&#233;compressi Compression [ par eldim ] Bonjour,Est-ce quelqu'un connait un programme zip qui v&#233;rifie si un fichier existe d&#233;ja dans un zip et compare les versions avant d'ajouter compresser un fichier en format zip [ par mohamed222222 ] Bonjour à tous !!Je voudrai compresser un fichier au format zip dans le répertoire où il se trouve !!!Quelqu'un peut m'aider svp !!merci d'avance Compression GZip .NET 2.0 [ par EvilGost ] Bonjour à tous les développeurs,je suis actuellement confronté à un problème. Pour mon appli, je dois compresser un répertoire complete, via GZip, int


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,452 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.