[Résolu] Décompresser .gz sous Windows
-
- Messages : 579
- Inscription : ven. 11/mai/2007 15:21
[Résolu] Décompresser .gz sous Windows
Bonjour,
J'ai un petit soucis dans un programme au boulot. Voilà le contexte:
- Mon appli (qui n'est pas codée en PB ni en C mais dans un SGBD pas très connu nommé Progress) tourne sur des PC clients sous Windows.
- Pour réaliser l'extraction d'un grand nombre de données, j'appelle un programme (toujours en Progress) qui tourne sur le serveur, génère le fichier, et le compresse avec un "gzip -9". Je ne peux pas utiliser Zip, car je dois être sûr que ça tourne sur tous les serveurs de ma boîte et Zip n'est pas forcément installé partout.
- Je récupère ensuite le fichier compressé sur le PC client, et j'essaie de le décompresser pour le lire. C'est là le problème.
En effet, sur le PC client, j'ai créé un petit exécutable PB intégrant la lib PureZip, et celle-ci ne reconnaît apparemment pas les ".gz". Je n'ai pas le droit de distribuer autre chose (ni winzip, ni 7zip; rien du tout).
Auriez-vous une idée ? Est-ce que quelqu'un a déjà intégré la compression / décompression gzip à un exécutable PB ?
J'ai un petit soucis dans un programme au boulot. Voilà le contexte:
- Mon appli (qui n'est pas codée en PB ni en C mais dans un SGBD pas très connu nommé Progress) tourne sur des PC clients sous Windows.
- Pour réaliser l'extraction d'un grand nombre de données, j'appelle un programme (toujours en Progress) qui tourne sur le serveur, génère le fichier, et le compresse avec un "gzip -9". Je ne peux pas utiliser Zip, car je dois être sûr que ça tourne sur tous les serveurs de ma boîte et Zip n'est pas forcément installé partout.
- Je récupère ensuite le fichier compressé sur le PC client, et j'essaie de le décompresser pour le lire. C'est là le problème.
En effet, sur le PC client, j'ai créé un petit exécutable PB intégrant la lib PureZip, et celle-ci ne reconnaît apparemment pas les ".gz". Je n'ai pas le droit de distribuer autre chose (ni winzip, ni 7zip; rien du tout).
Auriez-vous une idée ? Est-ce que quelqu'un a déjà intégré la compression / décompression gzip à un exécutable PB ?
Dernière modification par kelebrindae le jeu. 30/sept./2010 14:58, modifié 1 fois.
Les idées sont le souvenir de choses qui ne se sont pas encore produites.
Re: Décompresser .gz sous Windows
Un début avec les outils unix pour windows : http://unxutils.sourceforge.net/ 

Re: Décompresser .gz sous Windows
Tu as testé avec PureLZMA ?
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Re: Décompresser .gz sous Windows
Uh? http://fr.wikipedia.org/wiki/Gzip
http://www.gnu.org/software/gzip/
Gratuit, simple, un outil en ligne de commande dans la plus pure tradition Unix. Tu l'exécutes comme n'importe quel outil en ligne de commande, tu lui files des paramètres, par ex un nom d'archive et un chemin de sortie, et voilà. Tu peux même le piper (pardon, je fais de l'ollivier 2010 là)
http://www.gnu.org/software/gzip/
Gratuit, simple, un outil en ligne de commande dans la plus pure tradition Unix. Tu l'exécutes comme n'importe quel outil en ligne de commande, tu lui files des paramètres, par ex un nom d'archive et un chemin de sortie, et voilà. Tu peux même le piper (pardon, je fais de l'ollivier 2010 là)
-
- Messages : 579
- Inscription : ven. 11/mai/2007 15:21
Re: Décompresser .gz sous Windows
@Flaith & Djes:
Effectivement, il existe des versions Windows de Gzip, mais en fait je ne voulais pas ajouter un exe supplémentaire à mon appli; les centres régionaux qui gèrent les installs n'aiment pas trop qu'on ajoute des exécutables dans les diffusions (peur des virus, tous ça...). Par ailleurs, comme Progress (le SGBD que j'utilise) est un langage interprété, je ne suis pas censé diffuser des .exe => ça rajoute un peu de complexité à la constitution des paquets de diffusion...
Bref: je ne vais pas vous embêter avec notre cuisine interne, mais l'idée était plutôt de rajouter la possibilité de décompresser du Gzip à l'exécutable PB chargé du zippage que je livre déjà avec l'appli: ainsi, je ne livre aucun programme supplémentaire.
@Ar-S:
Non, je n'ai pas essayé. Mais d'après ce que je comprends, Gzip et Lzma n'utilisent pas le même algo de compression; peu de chances que ça marche, donc. Mais je vais quand même jeter un oeil au cas où (après tout, j'aurais peut-être besoin de gérer ce format aussi, un jour...)
Effectivement, il existe des versions Windows de Gzip, mais en fait je ne voulais pas ajouter un exe supplémentaire à mon appli; les centres régionaux qui gèrent les installs n'aiment pas trop qu'on ajoute des exécutables dans les diffusions (peur des virus, tous ça...). Par ailleurs, comme Progress (le SGBD que j'utilise) est un langage interprété, je ne suis pas censé diffuser des .exe => ça rajoute un peu de complexité à la constitution des paquets de diffusion...
Bref: je ne vais pas vous embêter avec notre cuisine interne, mais l'idée était plutôt de rajouter la possibilité de décompresser du Gzip à l'exécutable PB chargé du zippage que je livre déjà avec l'appli: ainsi, je ne livre aucun programme supplémentaire.
@Ar-S:
Non, je n'ai pas essayé. Mais d'après ce que je comprends, Gzip et Lzma n'utilisent pas le même algo de compression; peu de chances que ça marche, donc. Mais je vais quand même jeter un oeil au cas où (après tout, j'aurais peut-être besoin de gérer ce format aussi, un jour...)
Les idées sont le souvenir de choses qui ne se sont pas encore produites.
Re: Décompresser .gz sous Windows
En farfouillant sur la toile je viens de découvrir le Bzip2 http://www.bzip.org/ qui a l'air vraiment bien.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
- Progi1984
- Messages : 2659
- Inscription : mar. 14/déc./2004 13:56
- Localisation : France > Rennes
- Contact :
Re: Décompresser .gz sous Windows
Normalement, il faudrait créer un wrapper pour le librairie ZLib : http://www.winimage.com/zLibDll/index.html si il n'existe pas.
Et décompresser tes fichiers avec et ca devrait être bon.
Et décompresser tes fichiers avec et ca devrait être bon.
Librairies & Applications : https://www.purebasic.fr/french/viewtop ... f=8&t=6220
Site Web : https://rootslabs.net
Site Web : https://rootslabs.net
Re: Décompresser .gz sous Windows
....
Dernière modification par Backup le mar. 19/août/2014 11:34, modifié 1 fois.
Re: Décompresser .gz sous Windows
Ouaip mais cette manip est rarement apprécié des antivirus (ça dépend lesquels mais vaut mieux faire des tests).
sinon c'est clair que c'est la solution la plus zézé
sinon c'est clair que c'est la solution la plus zézé

~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Re: Décompresser .gz sous Windows
Comprends pas, la librairie zlib est déjà intégré à Purebasic, non ?
Voici un code de ts-soft pour l'utilisation :
Voici un code de ts-soft pour l'utilisation :
Code : Tout sélectionner
; Autor: Thomas (ts-soft) Schulz
; PB-Version: 4.xx
; OS: windows/linux/MacOS
CompilerSelect #PB_Compiler_OS
CompilerCase #PB_OS_Linux
ImportC #PB_Compiler_Home + "purelibraries/linux/libraries/zlib.a"
CompilerCase #PB_OS_MacOS
ImportC "/usr/lib/libz.dylib"
CompilerCase #PB_OS_Windows
ImportC "zlib.lib"
CompilerEndSelect
compress2(*dest, *destLen, *source, sourceLen, level)
uncompress(*dest, *destLen, *source, sourceLen)
EndImport
;Compression
Procedure.i gzdeflate(*source, sourceLen = #PB_Default, level = #PB_Default)
Protected *dest, destLen
If level < #PB_Default Or level > 9 : level = #PB_Default : EndIf
If *source
If sourceLen = #PB_Default : sourceLen = MemorySize(*source) : EndIf
destLen = sourceLen + 13 + (Int(sourceLen / 100))
*dest = AllocateMemory(destLen)
If *dest
If Not compress2(*dest, @destLen, *source, sourceLen, level)
*dest = ReAllocateMemory(*dest, destLen)
ProcedureReturn *dest
EndIf
EndIf
EndIf
EndProcedure
;Decompression
Procedure.i gzinflate(*source, *dest)
Protected sourceLen = MemorySize(*source)
Protected destLen = MemorySize(*dest)
If Not uncompress(*dest, @destLen, *source, sourceLen)
ProcedureReturn destLen
EndIf
EndProcedure
file$ = "source.c"
Global lengthOfFile.i
If ReadFile(0, file$)
lengthOfFile = Lof(0)
*MemoryID = AllocateMemory(lengthOfFile)
If *MemoryID
bytes = ReadData(0, *MemoryID, lengthOfFile)
EndIf
CloseFile(0)
Else
End
EndIf
;compression
*MemoryCompressed = gzdeflate(*MemoryID)
CreateFile(0, "source_c.gz")
WriteLong(0, lengthOfFile)
WriteData(0, *MemoryCompressed, MemorySize(*MemoryCompressed))
CloseFile(0)
;decompression
ReadFile(1, "source_c.gz")
sourcelen = ReadInteger(1)
;Debug "len file to compress = "+Str(sourcelen)
sourceMem = Lof(1) - SizeOf(Integer)
*MemoryCompressed = AllocateMemory(sourceMem)
*MemoryDecompress = AllocateMemory(sourcelen)
ReadData(1, *MemoryCompressed, sourceMem)
CloseFile(1)
gzinflate(*MemoryCompressed, *MemoryDecompress)
;et sauvegarde fichier décompressé
CreateFile(2, "source_deflate.c")
WriteData(2, *MemoryDecompress, MemorySize(*MemoryDecompress))
CloseFile(2)
-
- Messages : 579
- Inscription : ven. 11/mai/2007 15:21
Re: Décompresser .gz sous Windows
@Dobro: Bonne idée! Mais effectivement, l'anti-virus maison risque de ne pas aimer et je me ferais souffler dans les bronches...
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)
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 !
flaith a écrit :Comprends pas, la librairie zlib est déjà intégré à Purebasic, non ?


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)
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 !
Les idées sont le souvenir de choses qui ne se sont pas encore produites.
Re: Décompresser .gz sous Windows
C'est normal, car l'entête est différente, il suffirait de connaitre l'entête utilisé par le gz d'unix pour le mettre dans le petit programme que je t'ai mis avant les données compressés, ici il n'y a que la taille des données décompresséskelebrindae a écrit :...Par contre, mauvaise nouvelle, ton code ne parvient pas à décompresser les .gz généré par le Gzip Unix sur le serveur...

-
- Messages : 579
- Inscription : ven. 11/mai/2007 15:21
Re: [Résolu] Décompresser .gz sous Windows
Ok, je comprends. Je vais jeter un coup d'oeil dans la doc de Gzip, au cas où...
Merci!
Merci!
Les idées sont le souvenir de choses qui ne se sont pas encore produites.
Re: [Résolu] Décompresser .gz sous Windows
C'est bête, j'étais absent quelques temps.
J'avais un fichier tout prêt (avec la librarie statique ZLIB et le code PB pour les GZ) ici : http://gnozal.ucoz.com/PBLIB_ZLIB_Stati ... c_GZip.zip.
J'avais un fichier tout prêt (avec la librarie statique ZLIB et le code PB pour les GZ) ici : http://gnozal.ucoz.com/PBLIB_ZLIB_Stati ... c_GZip.zip.
-
- Messages : 579
- Inscription : ven. 11/mai/2007 15:21
Re: [Résolu] Décompresser .gz sous Windows
Gnozal, tu es le dieu de la compression! Si tu avais créé l'Univers, il ferait tout juste 3cm de côté...
En tout cas, merci. Je vais étudier ton code de près.
J'avais réussi à me débrouiller, mais si je peux utiliser la Zlib livrée avec Purebasic, ce sera aussi bien.
A+

En tout cas, merci. Je vais étudier ton code de près.
J'avais réussi à me débrouiller, mais si je peux utiliser la Zlib livrée avec Purebasic, ce sera aussi bien.
A+
Les idées sont le souvenir de choses qui ne se sont pas encore produites.