Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Neue Zip-Archiv Komponente (https://www.delphipraxis.net/205333-neue-zip-archiv-komponente.html)

Willie1 28. Aug 2020 17:40

Neue Zip-Archiv Komponente
 
Hallo Freunde*innen,
ich habe in meinem Programm die Zip-Komponente von Angus Johnson benutzt, die funktioniert mit dem neuen Delphi nicht mehr. Sie ist von 2006 und ich finde kein Update. Gibt es eine andere Lösung, die ich schnell verstehe, für mich. Ich will Bilder aus einem Zip-Archiv anzeigen. Auch das hat bisher 12 Jahre funktioniert.
Ich habe hier gesucht aber die Anfragen waren alle vor 2009.
Willie.

zeras 28. Aug 2020 17:42

AW: Neue Zip-Archiv Komponente
 
In neueren Delphi Versionen ist schon eine ZIP Komponente drin. Such doch weiter hier im Forum. Ich hatte da auch schon was dazu geschrieben.


Habe es gefunden. hier

Willie1 28. Aug 2020 18:32

AW: Neue Zip-Archiv Komponente
 
Wie heißt denn die Komponente? Ich bin im Suchen schlecht. Willie.

zeras 28. Aug 2020 18:35

AW: Neue Zip-Archiv Komponente
 
Hier klicken

Willie1 28. Aug 2020 18:43

AW: Neue Zip-Archiv Komponente
 
So komme ich weiter Danke. Willie.

scrat1979 28. Aug 2020 22:11

AW: Neue Zip-Archiv Komponente
 
ZipForge von ComponentAce wäre auch eine Option. Tolles Ding und unterstützt auch die aktuellen Delphi-Versionen

Willie1 30. Aug 2020 17:34

AW: Neue Zip-Archiv Komponente
 
69 $ ist eine Menge Geld. Ich habe die uralte 7z-Bibliothek für Delphi 10.x zum Laufen gebracht, vielleicht schaffe ich das auch noch mit der alten Zip-Komponente von 2006. Willie.

scrat1979 30. Aug 2020 18:43

AW: Neue Zip-Archiv Komponente
 
Zitat:

Zitat von Willie1 (Beitrag 1472626)
69 $ ist eine Menge Geld. Ich habe die uralte 7z-Bibliothek für Delphi 10.x zum Laufen gebracht, vielleicht schaffe ich das auch noch mit der alten Zip-Komponente von 2006. Willie.

Für den privaten Einsatz wäre es kostenlos. Das nur nebenbei bemerkt.

philipp.hofmann 30. Aug 2020 21:08

AW: Neue Zip-Archiv Komponente
 
Wenn funktional nichts dagegen spricht, würde ich immer TZipFile nehmen. ZipForge ist gut, aber wenn ich mich recht entsinne nur für Windows geeignet. TZipFile läuft mit allen von Delphi unterstützen Betriebssystemen. Ich persönlich nutze ZipForge auch, weil ich in einem Projekt mit riesen Zip-Dateien (um die 1 GB groß) zu tun hatte und dies ging mit TZipFile einfach nicht (zumindest nicht unter 32-bit).

Willie1 31. Aug 2020 16:32

AW: Neue Zip-Archiv Komponente
 
Ich will's mit TZipFile probieren. Es geht um max. 300 Bilder in einem Zip-Archiv.
Was will ich: ich möchte alle Bilder (die GPI+ lesen kann) aus einem Archiv heraus filtern, egal in welcher Ordnerebene des Archiv sich das Bild befindet und in einem Ordner ablegen. Dann liest mein Programm diese Bilder ein.
Kleiner Anfang von mir:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  PZip: TZipFile;
  Count: Integer;
  pf: string;
  SL: System.TArray<string>;
  i: integer;
begin
  if od.Execute then begin
  PZip:=TZipFile.Create;
    PZip.Open(od.FileName, zmRead);
    Pf:=TmpPath+'§§§~~~';
//    PZip.ExtractZipFile(od.FileName, Pf);
    Count:=PZip.FileCount; //hier werden Ordner mit gezählt
    SetLength(SL,Count);
    SL:=PZip.FileNames;
    for i:=0 to Count - 1 do begin
      //hier filtere ich Bilder aus
      PZip.Extract(SL[i], Pf, true);//<----
    end;
    PZip.Close;
    PZip.Free;
  end;
end;
Hier wird aber die Ordnerstruktur mit erzeugt und das will ich nicht. Willie.

Delphi.Narium 31. Aug 2020 16:40

AW: Neue Zip-Archiv Komponente
 
In die Hilfe schauen? http://docwiki.embarcadero.com/Libra...ipFile.Extract
Delphi-Quellcode:
procedure Extract(const FileName: string; const Path: string = ''; CreateSubdirs: Boolean = True); overload;
procedure Extract(Index: Integer; const Path: string = ''; CreateSubdirs: Boolean = True); overload;
Der letzte Parameter, den Du auf True gesetzt hast, steuert die Erzeugung der Ordnerstruktur. Ist er True, dann wird die Ordnerstruktur erzeugt, ist er false, dann nicht.

Einfach mal mit
Delphi-Quellcode:
PZip.Extract(SL[i], Pf, false);//<---
probieren?

himitsu 31. Aug 2020 17:02

AW: Neue Zip-Archiv Komponente
 
Zitat:

Zitat von Willie1 (Beitrag 1472680)
und in einem Ordner ablegen. Dann liest mein Programm diese Bilder ein.

Warum nicht direkt in einen TMemoryStream auslesen?
Dann isses auch gleich im Programm.

Willie1 31. Aug 2020 17:50

AW: Neue Zip-Archiv Komponente
 
Hallo Delph-Narium,
ich habe in die Hilfe gesehen! Nur wenn der Parameter auf false steht, muss ich vorher den Ordner selbst anlegen, sonst gibt es einen Fehler "Ordner nicht gefunden". Das hatte ich nicht bedacht. Himitsu, muss ich drüber nachdenken.
Willie.

Willie1 1. Sep 2020 17:21

AW: Neue Zip-Archiv Komponente
 
Hallo Himitsu, wie meinst du das mit TMemoryStream?
Ich habe bisher alle Bilder aus einem Archiv in einen temporären Ordner ausgepackt und dann durch mein Programm ausgelesen. Nach Schließen des Archivs habe ich den Ordner gelöscht.
Willie.

bernau 1. Sep 2020 17:54

AW: Neue Zip-Archiv Komponente
 
Zitat:

Zitat von Willie1 (Beitrag 1472772)
Hallo Himitsu, wie meinst du das mit TMemoryStream?


Du musst nicht den Umweg über eine Datei auf der Festplatte gehen. Du kannst die Bilder direkt aus dem ZipFile in ein Bitmap o.ä. laden.

Verwende System.Zip.TZipFile.Read

Delphi-Quellcode:
procedure Read(const FileName: string; out Stream: TStream; out LocalHeader: TZipHeader); overload;


Also ungefähr so (Nicht getestet, sondern nur hingetippt. Habe diese ZIP-Komponente noch nicht verwendet). Den Rest macht Google;-) Bei Google suchendelphi tzipfile read TMemoryStream example

Delphi-Quellcode:
var
  myMemoryStream:TMemoryStream;
  hdr:TZipHeader;
begin
  myMemoryStream:=TMemoryStream.Create;
    try
      zipfile.Read('myPicutre.bmp',myMemoryStream,hdr);
      myBitmap.LoadFromStream(myMemoryStream);
    finally
      myMemoryStream.Free;
    end;
end;

Willie1 1. Sep 2020 22:26

AW: Neue Zip-Archiv Komponente
 
Ok, zu spät am Abend. Muss ich ausprobieren. Willie.

Michael II 2. Sep 2020 10:26

AW: Neue Zip-Archiv Komponente
 
Hallo Willie

du schreibst in #10, dass du die Files aus der ZIP Datei zuerst auf Platte in einen Ordner abspeichern willst. Dabei willst du die in der ZIP vorhandene Unterordnerstruktur nicht übernehmen. Wenn du das so tust, dann sind wahrscheinlich Kollisionen punkto Filenamen nicht vermeidbar(?). Vielleicht hast du aber auch eindeutige Namen für deine Bilder gewählt - dann wäre ja alles gut.

ZIP Datei auspacken in einen Ordner ohne dabei die Unterordnerstruktur zu übernehmen:

Delphi-Quellcode:
procedure auspacken( zipfilename : string; ausgabeordner : string );
var
    zip : TZipfile;
    filename : string;

begin
  if forcedirectories(ausgabeordner) then
  if TZipFile.IsValid( zipfilename ) then
  begin
    zip := TZipFile.Create;
   try
    zip.Open( zipfilename,zmRead );
    for filename in zip.FileNames do
        zip.Extract( filename, ausgabeordner, false);
   finally
    zip.Free;
   end;
  end;
end;
Die Bilder filterst du vor (wenn du zum Beispiel nur auf FileExtension prüfst) oder nach dem Extract raus.

Wie oben mehrfach erwähnt wird: Wenn du Bild nach Bild in deinem Programm anzeigen (und nie als Datei auf Platte) willst, dann ist der Weg über Streams praktischer.

Willie1 3. Sep 2020 10:59

AW: Neue Zip-Archiv Komponente
 
Hallo Michael,
ich habe daran gedacht, wenn ich alle Bilder in einem Ordner auspacke, es zu Namenskonflikten kommen kann. Was passiert denn dann, gibt es Fehlermeldung oder Frage vor Überschreiben? Ich nenne mit meinem Programm, an dem ich gerade arbeite, alle Bilder nach dem Aufnahmedatum um : JJJJ.MM.TT=SS.mm.ss. Das geht natürlich nur mit Bildern, die das Aufnahmedatum speichern. An doppelte Bilder hänge ich _nnn (nat. Zahl) an. Das klappt seit Jahren gut.

Damals gab es TZipFile noch nicht, TMemoryStream werde ich auf die Todo-Liste setzen.

Ich filtere die Bilder tatsächlich mit der Dateiendung: if Pos(UpperCase(ExtractFileExt(Name)), PICTYPES) > 0 then ..
Die Funktion ..IsValid() bringt mich auf eine Idee. Gibt es die Möglichkeit ein JPG-Bild eindeutig zu erkennen, da es mehrere Ext für JPG-Bilder gibt. so eine Funktion, wie etwa IsJpeg() then ..
Willie.

Ich brauche länger zum Schreiben:(, dann wirft mich Delphi-Forum raus und ich muss mich neu anmelden, das ist blöd.

himitsu 3. Sep 2020 13:11

AW: Neue Zip-Archiv Komponente
 
SaveToFile fragt niemals.
Entweder es erstellt die Datei, oder überschreibt sie.

Du kannst vorher mit FileExists prüfen, oder du speicherst über SaveToStream mit einem TFileStream oder THandleStream+CreateFile,
da hast du dann die Wahl, ob immer ersellt/überschrieben werden soll, oder nur NeuErstellt, bzw. nur überschrieben.
Bei fehlenden Berechtigungen kommt es natürlich zu einer Exception.




Intern mit SaveToStream kann es niemals zu einem Konflikt kommen, da dort der Dateiname/Pfad egal ist.

PS: Mann kann in einer ZIP auch CaseSensitive speichern.
BILD.jpg
BILD.JPG
BILD.jpG
bild.jpg
...
das sind dann alles unterschiedliche Dateien.
Es lassen sich auch darin Dateien mit dem Namen "COM1" und Dergleichen speichern, aber sowas lässt sich im Windows nicht auf der Festplatte speichern.


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:26 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz