GZIP Datei entpacken (Linux und Windows)

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
atari1040
Beiträge: 21
Registriert: So 27. Dez 2020, 12:10

GZIP Datei entpacken (Linux und Windows)

Beitrag von atari1040 »

Moin,

ich habe eine Datei test.gz die ich mit FreePascal/Lazarus entpacken möchte.
Die gz Datei beinhaltet mehrere Dateien.

Gibt es eine einfache Möglichkeit wie bei zipper (der nur zip kann) eine gz Datei zu öffen und den unbekannten Inhalt in ein Destination Folder zu entpacken?

Danke für Eure Unterstützung


atari1040
Beiträge: 21
Registriert: So 27. Dez 2020, 12:10

Re: GZIP Datei entpacken (Linux und Windows)

Beitrag von atari1040 »

theo hat geschrieben:
Do 18. Jan 2024, 16:57
viewtopic.php?t=7602

Vllt. auch https://www.freepascal.org/~michael/art ... chives.pdf
Danke, die und viele andere habe ich gelesen aber keine löst das Problem in meiner Frage.

MmVisual
Beiträge: 1470
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 3.0 FPC 3.2)
CPU-Target: 32/64Bit

Re: GZIP Datei entpacken (Linux und Windows)

Beitrag von MmVisual »

Ich verwende gerne "Abbrevia", das kann man mit OPM zum Lazarus hinzu kompillieren.

Du kannst die GZIP Datei entweder als Datei öffnen oder als TStream. Damit kann man die GZIP Daten ohne Probleme im TMemoryStream halten. Entpacken kann man entweder in eine Datei oder auch in einen TStream, also auch in einen TMemoryStream.

Solltest du die Daten vom GZIP nur "intern" nutzen bietet sich die Stream Variante an, da man keine Dateien auf der Festplatte benötigt und somit auch die ganze Problematik mit Zugriffsrechte weg hat.

Hier bekommt man "Abbrevia 5.2.zip":
https://sourceforge.net/projects/tpabbrevia/files/
EleLa - Elektronik Lagerverwaltung - www.elela.de

atari1040
Beiträge: 21
Registriert: So 27. Dez 2020, 12:10

Re: GZIP Datei entpacken (Linux und Windows)

Beitrag von atari1040 »

MmVisual hat geschrieben:
Do 18. Jan 2024, 17:10
Ich verwende gerne "Abbrevia", das kann man mit OPM zum Lazarus hinzu kompillieren.

Du kannst die GZIP Datei entweder als Datei öffnen oder als TStream. Damit kann man die GZIP Daten ohne Probleme im TMemoryStream halten. Entpacken kann man entweder in eine Datei oder auch in einen TStream, also auch in einen TMemoryStream.

Solltest du die Daten vom GZIP nur "intern" nutzen bietet sich die Stream Variante an, da man keine Dateien auf der Festplatte benötigt und somit auch die ganze Problematik mit Zugriffsrechte weg hat.
Danke! Abbrevia habe ich vorher unter Windows benutzt aber aktuell bekomme ich das nicht mehr aus dem svn installiert. Auch nicht mit fpcupdeluxe. Ich war mir auch nicht sicher, ob das dann unter Linux läuft, wenn ich es wieder installiert bekommen würde.
Ich benötige die Dateien auf der Festplatte. Es handelt sich im Archiv um mehrere Dateien, deren genauen Dateinamen ich nicht kennen. Mit dem Zipper kann man wunderbar zip-Files in ein Directory entpacken. Einfach ZipFileName und dann Output-Directory und fertig.
Ich finde nichts vergleichbares für gz-Files.

MmVisual
Beiträge: 1470
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 3.0 FPC 3.2)
CPU-Target: 32/64Bit

Re: GZIP Datei entpacken (Linux und Windows)

Beitrag von MmVisual »

Es läuft unter Linux und Windows und Lazarus V3.0.
Ich installiere das nie und habe die Dateien in meinem Projekt einfach in einem Unterordner "Abbrevia" abgelegt und in den Projekteinstellungen > Compilereinstellungen noch in "Andere Units" und "Include-Dateien" jeweils den "Abbrevia" Ordner angefügt. Damit findet es Lazarus und man braucht es nicht installieren.
Das macht die Updates von Lazarus einfacher, da man nicht jedes mal alle Komponenten installieren muss.

Da wo du es dann brauchst bindest du die Unit "AbZipKit" mit ein, damit hast du Zugriff auf die Komponente:
Var HilfeZip: TAbZipKit;

Das war's dann. Der Download Link steht im letzten Posting.

Diverse Befehle die ich nutze:

Code: Alles auswählen

  HilfeZip := TAbZipKit.Create(frmMain);
  HilfeZip.Stream := TLazarusResourceStream.Create('Hilfe', 'ZIP');
  HilfeZip.Count
  HilfeZip.Items[i].FileName
  HilfeZip.ExtractToStream(HilfeZip.Items[i].FileName, stMemoryStream);
Nur mit GZIP habe ich die Komponente noch nie benutzt, sollte jedoch gehen da du es unter Windows schon benutzt hattest und es in deren Doku steht.
Zuletzt geändert von MmVisual am Do 18. Jan 2024, 17:32, insgesamt 1-mal geändert.
EleLa - Elektronik Lagerverwaltung - www.elela.de

atari1040
Beiträge: 21
Registriert: So 27. Dez 2020, 12:10

Re: GZIP Datei entpacken (Linux und Windows)

Beitrag von atari1040 »

MmVisual hat geschrieben:
Do 18. Jan 2024, 17:24
Es läuft unter Linux und Windows.
super, ich dachte weil es sich über fpcupdeluxe nicht mehr installieren lässt wäre es deprecated, ist ja auch schon sehr alt.
Wenn das auch unter Linux läuft ist es genau das, was ich suche.
Vielen Dank!!!!

MmVisual
Beiträge: 1470
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 3.0 FPC 3.2)
CPU-Target: 32/64Bit

Re: GZIP Datei entpacken (Linux und Windows)

Beitrag von MmVisual »

Alt != deprecated.

Alt und keine Änderungen bedeutet manchmal Fehlerfrei und so gut dass man es nicht mehr verbessern braucht ;-)
EleLa - Elektronik Lagerverwaltung - www.elela.de

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1436
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: GZIP Datei entpacken (Linux und Windows)

Beitrag von fliegermichl »

MmVisual hat geschrieben:
Do 18. Jan 2024, 17:33
Alt != deprecated.
HALLO was soll denn != sein. :-)
Wir sind hier in einem Pascal Forum.
Zuletzt geändert von fliegermichl am Fr 19. Jan 2024, 18:36, insgesamt 1-mal geändert.

Benutzeravatar
theo
Beiträge: 10499
Registriert: Mo 11. Sep 2006, 19:01

Re: GZIP Datei entpacken (Linux und Windows)

Beitrag von theo »

atari1040 hat geschrieben:
Do 18. Jan 2024, 17:02
Danke, die und viele andere habe ich gelesen aber keine löst das Problem in meiner Frage.
Warum denn nicht?
Bei dem Beispiel im Link oben muss man nur noch 2,3 Zeilen ergänzen um die Dateien im TAR "auf Platte" zu speichern. Es könnte ja auch sein, dass man es nur als Memorystream gebrauchen will, deshalb wurde das offen gelassen.
"Hausmittel" sind eigentlich immer besser, wenn es möglich ist. Damit brauchst du später nicht 3rd-Party-Code hinterherrennen.

Code: Alles auswählen

uses... ZStream, libtar; 
...
procedure TForm1.Button1Click(Sender: TObject);
var
  OutputStream: TMemoryStream;
  DeCompressionStream: TGZFileStream;
  i: integer;
  Buf: array[0..1023] of byte;
  TA: TTarArchive;
  DirRec: TTarDirRec;
  BasePath: string;
begin
  if OpenDialog1.Execute then
  begin
    if SelectDirectoryDialog1.Execute then
    begin
      BasePath := IncludeTrailingPathDelimiter(SelectDirectoryDialog1.FileName);
      OutputStream := TMemoryStream.Create;
      DecompressionStream := TGZFileStream.Create(OpenDialog1.FileName, gzopenread);
      DecompressionStream.Position := 0;
      repeat
        i := DecompressionStream.Read(Buf, SizeOf(Buf));
        if i <> 0 then OutputStream.Write(Buf, i);
      until i < SizeOf(Buf);
      DecompressionStream.Free;
      OutputStream.Position := 0;
      TA := TTarArchive.Create(OutputStream);
      TA.Reset;
      ClearDirRec(DirRec);
      while TA.FindNext(DirRec) do
      begin
        //ListBox1.Items.Add(BasePath + DirRec.Name);
        ForceDirectories(ExtractFileDir(BasePath + DirRec.Name));
        if ExtractFileName(BasePath + DirRec.Name) <> EmptyStr then
          TA.ReadFile(BasePath + DirRec.Name);
      end;
      TA.Free;
      OutputStream.Free;
    end;
  end;
end;    
Fehlerbehandlung kann man ja noch einfügen. So ist es erstmal übersichtlicher.

atari1040
Beiträge: 21
Registriert: So 27. Dez 2020, 12:10

Re: GZIP Datei entpacken (Linux und Windows)

Beitrag von atari1040 »

theo hat geschrieben:
Fr 19. Jan 2024, 11:03
atari1040 hat geschrieben:
Do 18. Jan 2024, 17:02
Danke, die und viele andere habe ich gelesen aber keine löst das Problem in meiner Frage.
Warum denn nicht?
...
Fehlerbehandlung kann man ja noch einfügen. So ist es erstmal übersichtlicher.
Erstmal Vielen Dank für Deine Antwort.
Ich gebe Dir Recht, dass man Bordmittel bevorzugen sollte. Allerdings ist das nur ein gz-Archiv und kein tar.gz. Ich habe kein tar und möchte auch keines schreiben. Ich wollte einfach nur das gz-File, welches mehrere Files enthält, direkt entpacken. Ich habe nicht verstanden, wie ich aus dem Stream heraus die Filenames ermitteln kann um sie in dem Verzeichnis wo das gz-File liegt zu entpacken. So wie man es bei zip-Files mit dem zipper machen kann. Ich benötige die Dateien auf der Platte und nicht im Memory.
Eigentlich reicht es mir sogar wenn ich den Filename des gz übergebe und er im ExtractFileDir(gzfile) die Dateien entpackt. So mache ich es jetzt mit dem TAbUnzipper => Unzipper.Filename => Unzipper.BaseDirectory => Unzipper.ExtractFiles('*.*') fertig.

atari1040
Beiträge: 21
Registriert: So 27. Dez 2020, 12:10

Re: GZIP Datei entpacken (Linux und Windows)

Beitrag von atari1040 »

Code: Alles auswählen

uses  AbUnzper, AbUtils, abbrevia 
...
procedure DeCompressGZipFiles(filename : TFileName);
var
  UnZipper : TAbUnZipper;
begin
  UnZipper := TAbUnZipper.Create(nil);
  try
    UnZipper.ForceType := True;
    UnZipper.ArchiveType := atGzip;
    UnZipper.FileName:= fileName;
    UnZipper.BaseDirectory:= ExtractFilePath(filename);
    UnZipper.ExtractFiles('*.*');
  finally
    FreeAndNil(UnZipper);
  end;
end; 
so etwas mit Bordmitteln wäre super

Benutzeravatar
theo
Beiträge: 10499
Registriert: Mo 11. Sep 2006, 19:01

Re: GZIP Datei entpacken (Linux und Windows)

Beitrag von theo »

Das kenne ich nicht.
GZIP ist meines Wissens kein Archiv, nur eine Kompression.
https://www.tutorialspoint.com/differen ... ip-and-tar

Was ist denn das?

atari1040
Beiträge: 21
Registriert: So 27. Dez 2020, 12:10

Re: GZIP Datei entpacken (Linux und Windows)

Beitrag von atari1040 »

theo hat geschrieben:
Fr 19. Jan 2024, 11:51
Das kenne ich nicht.
GZIP ist meines Wissens kein Archiv, nur eine Kompression.
https://www.tutorialspoint.com/differen ... ip-and-tar

Was ist denn das?
Da muss ich Dir Recht geben. Wir bekommen die als gz-Datei mit einigen grossen Dateien geliefert. Bis zu Deinem Hinweis habe ich noch gar nicht drüber nachgedacht, aber mit gzip haben die das Archiv wohl nicht erstellt. Die Endung ist *.gz und es ist auch kein zip-Format. Allerdings entpackt abbrevia die Dateien wie oben beschrieben mit ArchiveType := atGzip. Ich werde mal nachfragen, warum die das überhaupt so machen und was das für ein Format ist. Danke, der Hinweis war gut!

atari1040
Beiträge: 21
Registriert: So 27. Dez 2020, 12:10

Re: GZIP Datei entpacken (Linux und Windows)

Beitrag von atari1040 »

Vielen Dank! Ihr habt mir sehr geholfen und das Highlight war: Alt != deprecated.

Antworten