[gelöst] unzip tar.gz

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
DAP
Beiträge: 55
Registriert: Sa 15. Jan 2011, 00:14
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

[gelöst] unzip tar.gz

Beitrag von DAP »

hallo, ich habe eine gepackte Datei als tar-Archiv und bekomme beim entpacken den Fehler
corrupt file (bei Adresse 6342B8). Mit üblichen Packprogrammen kann die Datei aber entpackt werden. Ich vermute
schwer, dass der Fehler wieder mal bei mir liegt. Hier der benutzte Code:

Code: Alles auswählen

 
    UnZip := TUnZipper.Create;
    UnZip.FileName := (OpenDialog1.Filename);
    UnZip.OutputPath := ExtractFilePath(OpenDialog1.Filename);
 
    try
      UnZip.Examine;
      UnZip.UnZipAllFiles;
 
 
    except
      on E: Exception do
      begin
         ShowMessage('Fehler!');
      end;
    end;
 
    UnZip.Free;  
 
 
Zuletzt geändert von DAP am Do 27. Feb 2014, 17:30, insgesamt 1-mal geändert.

indianer-frank
Beiträge: 134
Registriert: So 30. Nov 2008, 21:53

Re: unzip tar.gz

Beitrag von indianer-frank »

Ein tar.gz ist mit gzip gepackt, und nicht im zip-Format!. Ich vermute, Dein Code will es als zip behandeln.

DAP
Beiträge: 55
Registriert: Sa 15. Jan 2011, 00:14
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: unzip tar.gz

Beitrag von DAP »

jetzt kommt die alles entscheidende Frage womit und wie?


DAP
Beiträge: 55
Registriert: Sa 15. Jan 2011, 00:14
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: unzip tar.gz

Beitrag von DAP »

das sieht ganz brauchbar aus, nur hat mir die google Suche leider keine brauchbaren Treffer
für Beispiele geliefert. Bestimmt kann mir einer aus dem Forum ein kleines Beispiel
geben, wie ich alle Dateien aus einem tararchiv milthilfe von ttararchive in ein
Verzeichnis entpacke.

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

Re: unzip tar.gz

Beitrag von theo »

Warum nicht einfach ein bisschen schlau suchen? Im Quellcode von libtar.pas steht z.B. drin wie es geht.
Wusste ich übrigens auch nicht, habe nur schnell nachgeschaut.

Meinst du eigentlich ein tar oder ein tar.gz?
Ein tar.gz musst du zuerst mit TGZFileStream entpacken und dann mit TTarArchive auslesen.

Code: Alles auswählen

 
procedure TForm1.Button1Click(Sender: TObject);
var
  OutputStream: TMemoryStream;
  DeCompressionStream: TGZFileStream;
  i: integer;
  Buf: array[0..1023] of byte;
  TA: TTarArchive;
  DirRec: TTarDirRec;
begin
  if OpenDialog1.Execute then
  begin
    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(DirRec.Name);
      //TA.ReadFile(DestFilename);
    end;
    TA.Free;
    OutputStream.Free;
  end;
end;      
Jetzt aber bitte selber denken. Try...finally etc. kann natürlich auch nicht schaden.
Zuletzt geändert von theo am Do 27. Feb 2014, 16:52, insgesamt 3-mal geändert.

DAP
Beiträge: 55
Registriert: Sa 15. Jan 2011, 00:14
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: unzip tar.gz

Beitrag von DAP »

vielen Dank theo, das hat mir sehr geholfen.
Übigens ich habe eine tar.gz, deshalb benötigte ich auch
den von dir verwendeten DecompressionStream.
theo hat geschrieben:
Jetzt aber bitte selber denken.
Ich würde das Forum nicht benutzen, wenn ich schon
alles könnte. Ich hatte versucht ähnliches im Netz
und im Forum zu finden, hatte aber nichts finden können
womit ich weiter arbeiten konnte. Bitte gehe nicht davon
aus, das die für dich simplen Lösungen anderen kein
Kopfzerbrechen bereiten. Auf diese Lösung wäre ich jedenfalls
nicht so schnell gekommen.

DAP
Beiträge: 55
Registriert: Sa 15. Jan 2011, 00:14
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: unzip tar.gz

Beitrag von DAP »

so, das entpacken der Dateien klappt sehr gut, jetzt möchte ich gerne
aus einer zu entpackenden Datei gleich den Stream verwenden, um die
enthaltenen Daten weiter zu verwenden. Die ASCII-Daten liegen mit Semikolon
getrennt in folgender Form vor:

Text;1231.12;1654654;44654564
Text;12.546;54654.123;465.456

hier mein Versuch die Daten zu lesen:

Code: Alles auswählen

 
 
 
 
      IF DirRec.Name = 'pegel_tageswerte.txt' then
      begin
        S := TStringlist.create;
        TextStream := TMemoryStream.create;
        TextStream.Position := 0;
 
        TA.ReadFile(TextStream);
 
        S.Delimiter := ';';
        S.StrictDelimiter := True;
        s.LoadFromStream(TextStream);
        s.DelimitedText;
 
        Memo1.Lines.AddStrings(s);
 
        TextStream.Free;
         S.free;
      end else
      begin
        TA.ReadFile(ExtractfilePath(OpenDialog1.FileName) + DirRec.Name);
      end;     
 
 
leider ist die Stringliste immer leer?

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

Re: unzip tar.gz

Beitrag von theo »

Wahrscheinlich musst du den Stream nochmal zurücksetzen:

Code: Alles auswählen

      TA.ReadFile(TextStream);
      TextStream.Position:=0;    
Den restlichen Code kommentiere ich jetzt freundlicherweise nicht... :wink:

DAP
Beiträge: 55
Registriert: Sa 15. Jan 2011, 00:14
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: unzip tar.gz

Beitrag von DAP »

theo hat geschrieben:Wahrscheinlich musst du den Stream nochmal zurücksetzen:

Code: Alles auswählen

      TA.ReadFile(TextStream);
      TextStream.Position:=0;    
danke theo, genau das war der Fehler, jetzt funktioniert's

Antworten