@Dobro: Bonne idée! Mais effectivement, l'anti-virus maison risque de ne pas aimer et je me ferais souffler dans les bronches...
flaith a écrit :Comprends pas, la librairie zlib est déjà intégré à Purebasic, non ?

Ah bin oui.
Alors là, tu m'en as appris une bonne (et très utile à la fois)! J'ai immédiatement stocké ton code dans mon répertoire "à conserver précieusement".
Par contre, mauvaise nouvelle, ton code ne parvient pas à décompresser les .gz généré par le Gzip Unix sur le serveur. Et les archives générées par ce code ne peuvent pas être relues par WinRar, qui pourtant peut lire les autres .gz. Il doit donc y avoir un souci quelque part...
Malgré tout, avec un principe similaire, j'ai résolu mon problème! En effet, dans le (très long) thread de PureZip dans le forum anglais, j'ai trouvé un type qui se posait la même question que moi.
L'illustre Gnozal et quelques autres lui ont débrouillé la sauce avec le code suivant, et il se trouve que ça marche chez moi aussi :
(je l'ai très légèrement modifié pour arriver à le lire plus facilement. Cf plus bas pour trouver la lib)
Code : Tout sélectionner
;
; Need ZlibStatic.lib
;
Import "d:\programmation\purebasic\projects\zipmagic\ZlibStatic.lib"
gzclearerr(a.l) As "_gzclearerr@4"
gzclose(a.l) As "_gzclose@4"
gzdopen(a.l,b.l) As "_gzdopen@8"
gzeof(a.l) As "_gzeof@4"
gzerror(a.l,b.l) As "_gzerror@8"
gzflush(a.l,b.l) As "_gzflush@8"
gzgetc(a.l) As "_gzgetc@4"
gzgets(a.l,b.l,c.l) As "_gzgets@12"
gzopen(a.l,b.l) As "_gzopen@8"
gzprintf() As "_gzprintf"
gzputc(a.l,b.l) As "_gzputc@8"
gzputs(a.l,b.l) As "_gzputs@8"
gzread(a.l,b.l,c.l) As "_gzread@12"
gzrewind(a.l) As "_gzrewind@4"
gzseek(a.l,b.l,c.l) As "_gzseek@12"
gzsetparams(a.l,b.l,c.l) As "_gzsetparams@12"
gztell(a.l) As "_gztell@4"
gzungetc(a.l,b.l) As "_gzungetc@8"
gzwrite(a.l,b.l,c.l) As "_gzwrite@12"
EndImport
;- --- Compression --
dir.s = "C:\temp\"
sourceFile.s = "test.txt"
archiveName.s = "compressed-test.gz"
source.s = dir + archiveName
fileHdl = gzopen(@source, @"wb9");Type of access permitted "wb" or "rb" + comressionlevel and strategy i.e. "wb9f"
; "r" : Opens for reading. If the file does not exist or cannot be found, the fopen call fails.
; "w" : Opens an empty file for writing. If the given file exists, its contents are destroyed.
;
; This are the same parameters as for the fopen function in c++
; 9 for max compression, 0 for no compression (0 can be good for controlling with an editor what happened).
; 'f' for filtered data as in "wb6f", 'h' for
; Huffman only compression as in "wb1h", Or 'R' For run-length encoding ...
; See the description of deflateInit2 in zlib.h for more information for these parameters
Debug "fileHdl for write= " + Str(fileHdl)
; Add a single character
; zerr=gzputc(fileHdl, Asc("H"))
; Add a string
; zerr=gzputs(fileHdl, @"Hello |");returns length of the uncompressed string
; Debug "err gzputs " + Str(zerr)
; Add a file
If ReadFile(0, dir + sourceFile)
length = Lof(0)
*Buffer = AllocateMemory(length)
If *Buffer <> 0
length = ReadData(0, *Buffer, length)
EndIf
CloseFile(0)
Else
Debug "'"+dir + sourceFile +"' not found!"
End
EndIf
zerr=gzwrite(fileHdl, *Buffer, length) ;returns length of the uncompressed
Debug "err gzwrite " + Str(zerr) ;string if successfull and a zerror if not
zerr=gzclose(fileHdl)
FreeMemory(*Buffer)
;- --- Decompression ---
dir.s = "C:\temp\"
archiveName.s = "test.txt.gz"
destinationFile.s = "uncompressed-test.txt"
target.s = dir + archiveName
If OpenFile(0,target)
length=Lof(0)
FileSeek(0,length-4)
length=ReadLong(0) ;the length of the uncompressed data is stored in the last 4 bytes
Debug "uncompressed length " + Str(length)
CloseFile(0)
EndIf
fileHdl = gzopen(@target, @"rb");"rb" for read byte, returns the file handle
Debug "fileHdl for read= " + Str(fileHdl)
Buffer$=Space(length)
len=gzread(fileHdl,@Buffer$,length)
Debug PeekS(@Buffer$)
Debug "Bytes read: " + Str(len);if len < 0 then an error occured
zerr=gzclose(fileHdl)
CreateFile(0,dir + destinationFile)
WriteString(0,PeekS(@Buffer$))
CloseFile(0)
Je me suis tapé une grosse galère pour trouver la lib: il en existe plein de versions différentes (je le sais; j'en ai essayé plein) et le lien donné par Gnozal ne marche plus... J'ai fini par la dégotter sur un obscur forum allemand (je ne parle pas allemand, alors je ne peux pas vous dire de quoi ça parlait).
Bref: pour vous éviter ça, je l'ai mise ici:
http://keleb.free.fr/pb/ZlibStatic.lib
Pour les tests, voici aussi un .gz généré par le Gzip UNIX:
http://keleb.free.fr/pb/test.txt.gz
Je mets le post en "Résolu"; Merci à tous pour votre aide !