Bonjour,
Je cherche de la doc sur les units de décompression zip, ziputils (éventuellement zlib) intégrées à Lazarus pour charger en mémoire un fichier de logs.gz compressé (sous Linux). Merci.
Cordialement. Gilles
Bonjour,
Je cherche de la doc sur les units de décompression zip, ziputils (éventuellement zlib) intégrées à Lazarus pour charger en mémoire un fichier de logs.gz compressé (sous Linux). Merci.
Cordialement. Gilles
Dernière modification par Invité ; 20/04/2010 à 16h32.
J'ai jeté un coup d'oeil aux sources de freepascal. Toutes les unités dont tu parles sont issues de 2 'packages' différents:
- zlib qui fournit l'unité zlib
- paszlib qui fournit plusieurs unité dont ziputils, zip et paszlib
Zlib est une interface pascal pour la bibliothèque zlib (http://www.zlib.net/). Paszlib est un portage 100% pascal de cette même bibliothèque.
Premier problème : choisir entre l'une ou l'autre. Je pense que Zlib plus de chance d'être à jours mais en contrepartie ton programme devient dépendant d'une bibliothèque partagée.
Dans un cas comme dans l'autre, au niveau documentations, tu dois pouvoir t'en tirer avec :
Merci pour la réponse rapide...
J'ai essayé d'utiliser TZipper et TUnZipper... La doc est tellement bien faite que je ne sais pas si cela compresse en .gz (et cela à la rigueur je m'en moque) et si cela décompresse du .gz (ceci m'intéresse).
Alors c'est tellement bien foutu que la procedure de Zip on la trouve (sur le bug tracker) ... mais pas l'utilisation d'UnZip
Cela m'agace un peu... Des plombes pour dezipper un malheureux fichier de log ! Je peux évidemment passer par BaseUnix mais quand même !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41 //uses zlib2; procedure TForm1.btnZipClick(Sender: TObject); var zipFile : string; Zipper: TZipper; F: TFileStream; begin if Trim(editFileName.Text) = '' then begin ShowMessage('You must supply a file name to zip.'); editFileName.SetFocus; Exit; end; if NOT FileExists( Trim(editFileName.Text) ) then begin ShowMessage('File '+Trim(editFileName.Text)+' not found.'); editFileName.SetFocus; Exit; end; btnZip.Enabled := False; Self.SetCursor(crHourGlass); try zipFile := Trim(editFileName.Text)+'.zip'; Zipper := TZipper.Create; Zipper.FileName := zipFile; F := TFileStream.Create(Trim(editFileName.Text), fmOpenRead); Zipper.Entries.AddFileEntry(F, Trim(editFileName.Text)); Zipper.ZipAllFiles; ShowMessage(zipFile+' created.'); finally F.Free; btnZip.Enabled := True; Self.SetCursor(crDefault); End; end;
Sinon, oui faut aller à la pêche dans les sources mais là je ne suis qu'utilisateur de l'IDE.
J'ai inversé le code avec Tunzipper. J'obtiens du SIGSEGV...
Mon problème c'est simplement, comment je peux décompresser un gz sous Linux avec Lazarus sans me prendre la tête et y passer une 1/2 journée ? [Quoique, j'en suis pas loin !]
Cordialement. Gilles
Dernière modification par Invité ; 21/04/2010 à 10h02.
Si ça peut t'aider un petit programme minimaliste pour dezipper une archive dans le dossier courant ('.') :
D'après la commande file de mon ubuntu les fichiers créés par TZipper sont du zip pas du gz. Et la décompression des gz ne marche pas alors que la zlib les prend en charge. Peut être qu'en utilisant pas paszlib mais l'unité zlib...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 program TestUnzip; {$mode objfpc} uses Classes, zipper; var InFile: String; AUnzipper: TUnzipper; begin InFile:='test.zip'; AUnzipper := TUnzipper.Create; AUnzipper.OutPutPath := '.'; AUnzipper.UnZipAllFiles(InFile); end.
Merci.
je teste et vous tiens au courant.
Cordialement. Gilles
Bonjour,
J'ai laissé tomber les ZIPs&co* et suis repassé directement au Tprocess. Ce code fonctionne : il dezippe puis lit le fichier .gz grâce à la commande linux zcat.
*Apparemment l'unit "intégrée" -si on peut dire- zLib pourrait convenir sachant qu'il faut récupérer une .so -si j'ai bien compris- et que la déclaration de zlib dans les uses indique rapidement qu'il manque un fichier.inc. Rq sur Delphi j'utilise 7z pour créer des archives (7za) et qui me donne toutes satisfactions même sur des grands volumes. 7za semble exister sous Linux. Enfin dans ce cas, ce n'est pas justifié : je voulais simplement lire les logs.gz.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 aStringList := TStringList.Create; //Deb lecture du fichier 'kern.log.2.gz' et chargement dans aStringList aProcess := TProcess.Create(nil); aProcess.CommandLine := 'zcat kern.log.2.gz'; aProcess.Options := aProcess.Options + [poUsePipes] - [poWaitOnExit]; //** aProcess.Execute; aStringList.LoadFromStream(aProcess.Output); aProcess.Free; //Fin lecture du fichier 'kern.log.2.gz' et chargement dans aStringList aStringList.SaveToFile('output.txt'); //Par exemple aStringList.Free;
**
+ [poUsePipes] Obligatoirement à true
- [poWaitOnExit] Obligatoirement à false (Normalement à false par défaut...)
Donc résolu mais mal... C'est décevant. Si quelqu'un(e) a mieux, je suis preneur.
Cordialement. Gilles
Dernière modification par Invité ; 21/04/2010 à 18h29.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager