Page 1 sur 2

la routine ZIP

Publié : mer. 01/nov./2006 20:51
par SPH
Quelqu'un a t'il deja codé la routine pour zipper un fichier ?
merci

Publié : mer. 01/nov./2006 21:02
par lionel_om
Y'a des Lib dispo, fais une recherche.
Par contre je ne les ai jamais testées...

Je suis entrain de le faire.

Publié : mer. 01/nov./2006 23:13
par meganet
Salut, jsuis entrain de comvertir une routine en c en pb pour zip, mais je suis loin d'avoir fini (quoi que peut-être, jvais être à l'osto pour 2 jours, j'aurai peut-être el tmps de le finir).

Publié : jeu. 02/nov./2006 9:31
par Progi1984

Publié : jeu. 02/nov./2006 17:14
par SPH
Progi1984 a écrit :Regarde PureZip de Gnozal
http://people.freenet.de/gnozal/PureZIP_.htm

http://people.freenet.de/gnozal/ (bas de page)
Oui, je lai decouvert et c'est super.
Cependant, helas, dans cette exemple, j'aurais bien voulu ecrire sous forme de fichier la chaine de caractere zippée :

Code : Tout sélectionner

; -=====================================================================================-
;                                  PureZIP test file 2
; -=====================================================================================-
;
PackTest.s = "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789"
SourceLength = Len(PackTest)
*SourceMemoryID = AllocateMemory(SourceLength)
PokeS(*SourceMemoryID, PackTest, SourceLength)
DestinationLength = SourceLength + (SourceLength * 0.01) + 12
*DestinationMemoryID = AllocateMemory(DestinationLength)
Debug "Original size = " + Str(SourceLength)
; Pack memory area
Debug PureZIP_PackMemory(*SourceMemoryID, SourceLength, *DestinationMemoryID, @DestinationLength)
Debug "Packed size = " + Str(DestinationLength)
; Unpack memory area
Debug PureZIP_UnpackMemory(*DestinationMemoryID, DestinationLength, *SourceMemoryID, @SourceLength)
Debug "Unpacked size = " + Str(SourceLength)
UnpackTest.s = Space(SourceLength)
UnpackTest = PeekS(*SourceMemoryID, @SourceLength)
If UnpackTest = PackTest
  Debug "Pack / Unpack : success"
Else
  Debug "Pack / Unpack : failed"
EndIf
Helas, il n'y a pas de "PackZipped.s"

Re: la routine ZIP

Publié : jeu. 02/nov./2006 17:30
par Flype
SPH a écrit :Quelqu'un a t'il deja codé la routine pour zipper un fichier ?
merci
c'est pour un défi/challenge ou pour avoir un truc discret (routine dans l'exe) ?

parce que réinventer la roue c'est intéressant (sur le plan personnel on apprends plein de trucs) mais vaut mieux utiliser des libs (static) toutes faites genre ZLIB à utiliser avec Import/EndImport par exemple.

Publié : jeu. 02/nov./2006 17:32
par Flype
Helas, il n'y a pas de "PackZipped.s"
demande à gnozal, je suis sûr qu'il peut faire quelquechose !

Re: la routine ZIP

Publié : jeu. 02/nov./2006 17:39
par SPH
Flype a écrit :
SPH a écrit :Quelqu'un a t'il deja codé la routine pour zipper un fichier ?
merci
c'est pour un défi/challenge ou pour avoir un truc discret (routine dans l'exe) ?
Bin, ni l'un ni l'autre. J'avais besoin de zipper depuis un code PB des fichiers...

Publié : jeu. 02/nov./2006 23:50
par Jacobus

Code : Tout sélectionner

;petit exemple de compression zip avec la lib Pure_Zip de Gnozal
;le reste est dans le chm de Pure_Zip

;tu peux mettre ça dans une procédure et tu as ta routine
FileToZip$ = ;chemin complet du fichier ou dossier à compresser
If FileSize(FileToZip$)=-2 ;si c'est un dossier
    MyZIP.s = FileToZip$+".zip"; le zip de destination
    FileToZip$ = FileToZip$+"\"; ajoute le \ de fin si nécessaire
    MyFilesToZIP.s = FileToZip$+"*.*"; tous types de fichiers
    If PureZIP_AddFiles(MyZIP, MyFilesToZIP, #PureZIP_StorePathRelative, #PureZIP_Recursive)<>#Null; création du dossier zippé
      MessageRequester("ZIP","La compression a réussie",#MB_ICONINFORMATION)
     Else 
      MessageRequester("ERREUR","Une erreur est survenue lors de la compression",#MB_ICONEXCLAMATION)   
    EndIf   
 Else ; sinon c'est un fichier
    ext$    = GetExtensionPart(FileToZip$) 
    MyZIP.s = RemoveString(FileToZip$,"."+ext$,1)+".zip"; on remplace l'extension par .zip
    If PureZIP_AddFile(MyZIP, FileToZip$, #PureZIP_StorePathRelative); création du fichier zippé
     MessageRequester("ZIP","La compression a réussie",#MB_ICONINFORMATION)
     Else 
       MessageRequester("ERREUR","Une erreur est survenue lors de la compression",#MB_ICONEXCLAMATION)
    EndIf  
EndIf 

Publié : ven. 03/nov./2006 4:33
par SPH
Merci jacobus. Je precise juste que ta routine m'a dit que la compression avait reussi alors que le zip contenait un fichier plus petit que l'original. Et en effet, la decompression ne restitue pas l'original...

En fait, gnozal donne un exemple de compression d'un fichier. Mais moi, c'etait un string en memoire que je voulais zipper PUIS ENSUITE ecrire en fichier. J'espere que tu vois ce que je veux dire...

Publié : ven. 03/nov./2006 10:19
par KarLKoX
compression

Code : Tout sélectionner

chaine.s = "salut bande de taré, c'est super l'apres midi, qu'est ce qu'on regarde, à la télé, biouman et dorothé !!!"
outfilesize.l = len(chaine)
compressedsize = outfilesize + (outfilesize * 0.01) + 12
*pCompressedData = AllocateMemory(compressedsize)
 If PureZIP_PackMemory(@chaine, outfilesize, *pCompressedData, @compressedsize) = #Z_OK
  writedata(FIO,*pCompressedData,compressedsize)
else
  ; erreur
endif
décompression

Code : Tout sélectionner

origsize = TAILLE_CHAINE_NON_COMPRESSEE
*pData = AllocateMemory(origsize)
*pCompressedData = AllocateMemory(compressedsize)
if PureZIP_UnpackMemory(*pCompressedData, compressedsize.l, *pData, @origsize)  = #Z_OK
   ; renvoie la chaine originale
   debug peeks(*pData)
else
  ; erreur
endif
De tête, code pas testé.

Publié : ven. 03/nov./2006 12:33
par SPH
MERCI KARLKOX

En corrigeant les fautes, cela donne :

Code : Tout sélectionner

chaine.s = "salut bande de taré, c'est super l'apres midi, qu'est ce qu'on regarde, à la télé, biouman et dorothé !!!" 
outfilesize.l = Len(chaine)

compressedsize = outfilesize + (outfilesize * 0.01) + 12 
*pCompressedData = AllocateMemory(compressedsize) 
 If PureZIP_PackMemory(@chaine, outfilesize, *pCompressedData, @compressedsize) = #Z_OK 

If CreateFile(0, "c:\ESKECAMARCHEUX.zip")   ; Création d'un nouveau fichier...
  WriteData(0,*pCompressedData,compressedsize) 
  CloseFile(0)  
EndIf

Else 
  Debug ("erreur")
EndIf 
Pour la decompression, j'utilise directement un logiciel de decompression donc, la routine qui m'interesse actu est seulement celle de compression.

Helas, le ZIP généré par ta routine ne fonctionne pas. OU ALORS, ta routine genere un TXT. Et dans ce cas, la routine de decompression que tu propose est incomplete car tu n'indiques pas le fichier ciblé....

Publié : ven. 03/nov./2006 13:56
par KarLKoX
Ton logiciel ne pourra pas décompresser ces données car en compressant comme on le fait, les entêtes de fichiers ne sont pas créées, car gnozal part du principe que nous savons ce que nous faisont avec nos données comme par exemple, le niveau de compression, la taille originale du fichier.
Si tu veux que ce soit compatible avec n'importe quel fichier, il te faudra créer l'entête de fichier du format ZIP et y ajouter ensuite les données compressées.

Publié : ven. 03/nov./2006 17:01
par SPH
KarLKoX a écrit :Ton logiciel ne pourra pas décompresser ces données car en compressant comme on le fait, les entêtes de fichiers ne sont pas créées, car gnozal part du principe que nous savons ce que nous faisont avec nos données comme par exemple, le niveau de compression, la taille originale du fichier.
Si tu veux que ce soit compatible avec n'importe quel fichier, il te faudra créer l'entête de fichier du format ZIP et y ajouter ensuite les données compressées.
Ha ok, donc, ta routine de decompression corrigée m'interesserait alors. Si tu pouvais la retoucher...
MERCI

Publié : ven. 03/nov./2006 17:29
par gnozal
SPH a écrit :Merci jacobus. Je precise juste que ta routine m'a dit que la compression avait reussi alors que le zip contenait un fichier plus petit que l'original. Et en effet, la decompression ne restitue pas l'original...

En fait, gnozal donne un exemple de compression d'un fichier. Mais moi, c'etait un string en memoire que je voulais zipper PUIS ENSUITE ecrire en fichier. J'espere que tu vois ce que je veux dire...
Pas exactement, non, mais j'essaye de deviner.

Pour créer un ZIP à partir de données à compresser en mémoire, on peut utiliser la séquence suivante :
PureZIP_Archive_Create(ArchiveFileName.s, #APPEND_STATUS_CREATE) pour créer le ZIP ArchiveFileName
PureZIP_Archive_CompressMem(FileName.s, *MemoryBank, MemoryBankSize.l) pour compresser le contenu de *MemoryBank dans le ZIP sous le nom de FileName
PureZIP_Archive_Close() pour fermer le ZIP

Je précise au passage que PureZIP_(Un)PackMemory sert à compresser/décompresser des données mais sans en-tête ZIP (donc c'est à l'utilisateur de créer ses propres routines de compression/décompression des données) ; il s'agit simplement de la transcription directe de ZLIB(Un)Compress.