![]() |
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. |
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. ![]() |
AW: Neue Zip-Archiv Komponente
Wie heißt denn die Komponente? Ich bin im Suchen schlecht. Willie.
|
AW: Neue Zip-Archiv Komponente
|
AW: Neue Zip-Archiv Komponente
So komme ich weiter Danke. Willie.
|
AW: Neue Zip-Archiv Komponente
ZipForge von ComponentAce wäre auch eine Option. Tolles Ding und unterstützt auch die aktuellen Delphi-Versionen
|
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.
|
AW: Neue Zip-Archiv Komponente
Zitat:
|
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).
|
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:
Hier wird aber die Ordnerstruktur mit erzeugt und das will ich nicht. Willie.
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; |
AW: Neue Zip-Archiv Komponente
In die Hilfe schauen?
![]()
Delphi-Quellcode:
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.
procedure Extract(const FileName: string; const Path: string = ''; CreateSubdirs: Boolean = True); overload;
procedure Extract(Index: Integer; const Path: string = ''; CreateSubdirs: Boolean = True); overload; Einfach mal mit
Delphi-Quellcode:
probieren?
PZip.Extract(SL[i], Pf, false);//<---
|
AW: Neue Zip-Archiv Komponente
Zitat:
Dann isses auch gleich im Programm. |
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. |
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. |
AW: Neue Zip-Archiv Komponente
Zitat:
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 ![]()
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;-) ![]()
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; |
AW: Neue Zip-Archiv Komponente
Ok, zu spät am Abend. Muss ich ausprobieren. Willie.
|
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:
Die Bilder filterst du vor (wenn du zum Beispiel nur auf FileExtension prüfst) oder nach dem Extract raus.
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; 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. |
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. |
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 07:35 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz