la routine ZIP

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
SPH
Messages : 4949
Inscription : mer. 09/nov./2005 9:53

la routine ZIP

Message par SPH »

Quelqu'un a t'il deja codé la routine pour zipper un fichier ?
merci
lionel_om
Messages : 1500
Inscription : jeu. 25/mars/2004 11:23
Localisation : Sophia Antipolis (Nice)
Contact :

Message par lionel_om »

Y'a des Lib dispo, fais une recherche.
Par contre je ne les ai jamais testées...
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
meganet
Messages : 317
Inscription : jeu. 20/janv./2005 22:00

Je suis entrain de le faire.

Message 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).
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message par Progi1984 »

Avatar de l’utilisateur
SPH
Messages : 4949
Inscription : mer. 09/nov./2005 9:53

Message 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"
Dernière modification par SPH le ven. 03/nov./2006 12:34, modifié 1 fois.
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Re: la routine ZIP

Message 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.
Image
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message par Flype »

Helas, il n'y a pas de "PackZipped.s"
demande à gnozal, je suis sûr qu'il peut faire quelquechose !
Image
Avatar de l’utilisateur
SPH
Messages : 4949
Inscription : mer. 09/nov./2005 9:53

Re: la routine ZIP

Message 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...
Avatar de l’utilisateur
Jacobus
Messages : 1559
Inscription : mar. 06/avr./2004 10:35
Contact :

Message 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 
Quand tous les glands seront tombés, les feuilles dispersées, la vigueur retombée... Dans la morne solitude, ancré au coeur de ses racines, c'est de sa force maturité qu'il renaîtra en pleine magnificence...Jacobus.
Avatar de l’utilisateur
SPH
Messages : 4949
Inscription : mer. 09/nov./2005 9:53

Message 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...
KarLKoX
Messages : 1191
Inscription : jeu. 26/févr./2004 15:36
Localisation : France
Contact :

Message 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é.
"Qui baise trop bouffe un poil." P. Desproges
Avatar de l’utilisateur
SPH
Messages : 4949
Inscription : mer. 09/nov./2005 9:53

Message 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é....
KarLKoX
Messages : 1191
Inscription : jeu. 26/févr./2004 15:36
Localisation : France
Contact :

Message 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.
"Qui baise trop bouffe un poil." P. Desproges
Avatar de l’utilisateur
SPH
Messages : 4949
Inscription : mer. 09/nov./2005 9:53

Message 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
gnozal
Messages : 832
Inscription : mar. 07/déc./2004 17:35
Localisation : France
Contact :

Message 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.
Répondre