la routine ZIP
la routine ZIP
Quelqu'un a t'il deja codé la routine pour zipper un fichier ?
merci
merci
-
- Messages : 1500
- Inscription : jeu. 25/mars/2004 11:23
- Localisation : Sophia Antipolis (Nice)
- Contact :
Y'a des Lib dispo, fais une recherche.
Par contre je ne les ai jamais testées...
Par contre je ne les ai jamais testées...
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
Participez à son extension: ajouter vos programmes et partagez vos codes !
Je suis entrain de le faire.
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).
- Progi1984
- Messages : 2659
- Inscription : mar. 14/déc./2004 13:56
- Localisation : France > Rennes
- Contact :
Regarde PureZip de Gnozal
http://people.freenet.de/gnozal/PureZIP_.htm
http://people.freenet.de/gnozal/ (bas de page)
http://people.freenet.de/gnozal/PureZIP_.htm
http://people.freenet.de/gnozal/ (bas de page)
Librairies & Applications : https://www.purebasic.fr/french/viewtop ... f=8&t=6220
Site Web : https://rootslabs.net
Site Web : https://rootslabs.net
Oui, je lai decouvert et c'est super.Progi1984 a écrit :Regarde PureZip de Gnozal
http://people.freenet.de/gnozal/PureZIP_.htm
http://people.freenet.de/gnozal/ (bas de page)
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
Dernière modification par SPH le ven. 03/nov./2006 12:34, modifié 1 fois.
Re: la routine ZIP
c'est pour un défi/challenge ou pour avoir un truc discret (routine dans l'exe) ?SPH a écrit :Quelqu'un a t'il deja codé la routine pour zipper un fichier ?
merci
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.
Re: la routine ZIP
Bin, ni l'un ni l'autre. J'avais besoin de zipper depuis un code PB des fichiers...Flype a écrit :c'est pour un défi/challenge ou pour avoir un truc discret (routine dans l'exe) ?SPH a écrit :Quelqu'un a t'il deja codé la routine pour zipper un fichier ?
merci
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.
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...
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...
compression
décompression
De tête, code pas testé.
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
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
"Qui baise trop bouffe un poil." P. Desproges
MERCI KARLKOX
En corrigeant les fautes, cela donne :
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é....
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
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é....
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.
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
Ha ok, donc, ta routine de decompression corrigée m'interesserait alors. Si tu pouvais la retoucher...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.
MERCI
Pas exactement, non, mais j'essaye de deviner.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...
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.