[Résolu] Décompresser .gz sous Windows

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
kelebrindae
Messages : 579
Inscription : ven. 11/mai/2007 15:21

[Résolu] Décompresser .gz sous Windows

Message par kelebrindae »

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 ?
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.
Avatar de l’utilisateur
flaith
Messages : 1487
Inscription : jeu. 07/avr./2005 1:06
Localisation : Rennes
Contact :

Re: Décompresser .gz sous Windows

Message par flaith »

Un début avec les outils unix pour windows : http://unxutils.sourceforge.net/ :wink:
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Décompresser .gz sous Windows

Message par Ar-S »

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
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: Décompresser .gz sous Windows

Message par djes »

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à)
kelebrindae
Messages : 579
Inscription : ven. 11/mai/2007 15:21

Re: Décompresser .gz sous Windows

Message par kelebrindae »

@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...)
Les idées sont le souvenir de choses qui ne se sont pas encore produites.
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Décompresser .gz sous Windows

Message par Ar-S »

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

Re: Décompresser .gz sous Windows

Message par Progi1984 »

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.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Décompresser .gz sous Windows

Message par Backup »

....
Dernière modification par Backup le mar. 19/août/2014 11:34, modifié 1 fois.
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Décompresser .gz sous Windows

Message par Ar-S »

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é :mrgreen:
~~~~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
Avatar de l’utilisateur
flaith
Messages : 1487
Inscription : jeu. 07/avr./2005 1:06
Localisation : Rennes
Contact :

Re: Décompresser .gz sous Windows

Message par flaith »

Comprends pas, la librairie zlib est déjà intégré à Purebasic, non ?
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)
kelebrindae
Messages : 579
Inscription : ven. 11/mai/2007 15:21

Re: Décompresser .gz sous Windows

Message par kelebrindae »

@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 ?
8O Ah bin oui. 8O
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". :D

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 !
Les idées sont le souvenir de choses qui ne se sont pas encore produites.
Avatar de l’utilisateur
flaith
Messages : 1487
Inscription : jeu. 07/avr./2005 1:06
Localisation : Rennes
Contact :

Re: Décompresser .gz sous Windows

Message par flaith »

kelebrindae 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...
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és :wink:
kelebrindae
Messages : 579
Inscription : ven. 11/mai/2007 15:21

Re: [Résolu] Décompresser .gz sous Windows

Message par kelebrindae »

Ok, je comprends. Je vais jeter un coup d'oeil dans la doc de Gzip, au cas où...

Merci!
Les idées sont le souvenir de choses qui ne se sont pas encore produites.
gnozal
Messages : 832
Inscription : mar. 07/déc./2004 17:35
Localisation : France
Contact :

Re: [Résolu] Décompresser .gz sous Windows

Message par gnozal »

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.
kelebrindae
Messages : 579
Inscription : ven. 11/mai/2007 15:21

Re: [Résolu] Décompresser .gz sous Windows

Message par kelebrindae »

Gnozal, tu es le dieu de la compression! Si tu avais créé l'Univers, il ferait tout juste 3cm de côté... :wink:

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