![]() |
zLib - FileIsCompressed
Hallo zusammen,
ich will mich heute Abend erstmals mit der zLib beschäftigen. Meine User können verschiedene ProjektFiles auswählen, öffnen und speichern. Bisher liegen die immer "original" vor. Nun möchte ich sie komprimiert ablegen (das werde ich wohl schaffen). Die Dateiendungen will ich dabei gleich belassen. Gibt es eine Funktion, die möglichst zuverlässig erkennt, ob ein File von zLib komprimiert wurde? Die User sollen auch die Möglichkeit behalten, alte, nicht komprimierte Files zu öffnen. |
AW: zLib - FileIsCompressed
Am Header der Datei
|
AW: zLib - FileIsCompressed
Wenn man es nur ZLib-komprimiert, dann gibt es keinen Header.
Diesen muß man schon selber einfügen. Aber wenn man weiß, um was für eine Datei es sich handeln soll,ann könnte man versuchen davon den Header zu ermitteln, falls eis einen Eindeutigen gibt. |
AW: zLib - FileIsCompressed
Danke Euch beiden.
Ich mache das jetzt einfach in einem try-Block. Das funktioniert super! Hier mal meine Zip-Unit, falls das jemand brauchen kann... Ich habe eine FileCopyCompress und FileCopyDecompress-Funktion eingeführt. So kann man einfach eine Datei kopieren UND DABEI komprimieren (ein bisheriges "FileCopy" kann man ggf. ersetzen). Auf dem Rückweg geht das entsprechend. Ich nutze das, um Datenbanken komprimiert abzuspeichern und später wieder herzustellen. Lässt sich eine Datei nicht dekomprimieren (wenn sie z.B. unkomprimiert vorliegt) wird sie normal kopiert. Für meine Zwecke ist das o.k.
Delphi-Quellcode:
unit ssZip;
interface uses Classes; procedure CompressStream(inStream, outStream: TStream); function DecompressStream(inStream, outStream: TStream): Boolean; procedure CopyFileCompress(FileNameFrom, FileNameTo: PWideChar); procedure CopyFileDecompress(FileNameFrom, FileNameTo: PWideChar); implementation uses ZLib, Windows, SysUtils; const BUFSIZE = 1024 * 16; procedure CompressStream(inStream, outStream: TStream); var cs: TCompressionStream; begin inStream.Position := 0; outStream.Size := 0; cs := TCompressionStream.Create(clDefault, outStream); cs.CopyFrom(inStream, 0); // copy all cs.Free; end; function DecompressStream(inStream, outStream: TStream): Boolean; var ds: TDecompressionStream; buf: string; begin Result := True; try inStream.Position := 0; outStream.Size := 0; ds := TDecompressionStream.Create(inStream); repeat SetLength(buf, BUFSIZE); SetLength(buf, ds.Read(buf[1], BUFSIZE)); outStream.Write(buf[1], Length(buf)); until buf = ''; except Result := False; end; ds.Free; end; procedure CopyFileCompress(FileNameFrom, FileNameTo: PWideChar); var FSC, FSD: TFileStream; begin FSD := TFileStream.Create(String(FileNameFrom), fmOpenRead); FSC := TFileStream.Create(String(FileNameTo), fmCreate); CompressStream(FSD, FSC); FreeAndNil(FSD); FreeAndNil(FSC); end; procedure CopyFileDecompress(FileNameFrom, FileNameTo: PWideChar); var FSC, FSD: TFileStream; EF: Boolean; begin FSC := TFileStream.Create(String(FileNameFrom), fmOpenRead); FSD := TFileStream.Create(String(FileNameTo), fmCreate); EF := not DecompressStream(FSC, FSD); FreeAndNil(FSC); FreeAndNil(FSD); if EF then CopyFile(FileNameFrom, FileNameTo, False); end; end. Falls jemand eine Lösung hat, ganze Ordner in einer Zip zu speichern würde mich das noch interessieren. Ich habe mich damit noch nicht näher beschäftigt. |
AW: zLib - FileIsCompressed
Hallo Stahli,
diese Thread ist zwar schon ein Stück her, aber ich habe mich jetzt auch erstmals mit der Zlib beschäftigt. Hast du diese Procedure so in Benutzung? Wenn ich diese so compiliere erhalte ich zunächst die Meldung "Inkompatible Typen: 'WideChar' und 'Char'" in der letzten Zeile
Delphi-Quellcode:
Ich hab das erst mal auskommentiert und somit tuts was es soll. Zu Testzwecken habe ich mir erst mal ein "showMessage.. eingebaut, dazu kommt es aber garnicht erst.
if EF then CopyFile(FileNameFrom, FileNameTo, False);
Nun hab ich aber tatsächlich eine unkompriemierte Datei geladen, damit kriege ich sofort eine exeption bei
Delphi-Quellcode:
Was mich auch wundert, ist die Meldung "Variable 'ds' ist möglicherweise nicht initialisiert worden".
EF := not DecompressStream(FSC, FSD);
Arbeitest du selber mit dieser funktion? Ich würde mir diese gerne mit einbauen, dazu sollte aber das Problem bei unkomrimierten Datein behoben werden, ich weiß nur nicht wie. Viele Grüße! |
AW: zLib - FileIsCompressed
Ich habe noch 2 kleine Änderungen eingebaut und das so praktisch im Einsatz.
Man kann die Komprimierung jetzt auch über ein Flag abschalten. Unter Debugkontrolle werden auftretende Exceptions angezeigt, ohne Debuger dann nicht mehr.
Delphi-Quellcode:
unit ssZip;
interface uses Classes; procedure CompressStream(inStream, outStream: TStream); function DecompressStream(inStream, outStream: TStream): Boolean; procedure CopyFileCompress(FileNameFrom, FileNameTo: PWideChar); procedure CopyFileDecompress(FileNameFrom, FileNameTo: PWideChar); var DoNotCompress: Boolean = False; implementation uses ZLib, Windows, SysUtils; const BUFSIZE = 1024 * 16; procedure CompressStream(inStream, outStream: TStream); var cs: TCompressionStream; begin inStream.Position := 0; outStream.Size := 0; if inStream.Size > 0 then begin cs := TCompressionStream.Create(clDefault, outStream); cs.CopyFrom(inStream, 0); // copy all cs.Free; end; end; function DecompressStream(inStream, outStream: TStream): Boolean; var ds: TDecompressionStream; buf: string; begin Result := True; inStream.Position := 0; outStream.Size := 0; if inStream.Size > 0 then begin ds := TDecompressionStream.Create(inStream); try repeat SetLength(buf, BUFSIZE); SetLength(buf, ds.Read(buf[1], BUFSIZE)); if Length(buf) = 0 then Break; outStream.Write(buf[1], Length(buf)); until buf = ''; except Result := False; end; ds.Free; end; end; procedure CopyFileCompress(FileNameFrom, FileNameTo: PWideChar); var FSC, FSD: TFileStream; begin if DoNotCompress then CopyFile(FileNameFrom, FileNameTo, False) else begin FSD := TFileStream.Create(String(FileNameFrom), fmOpenRead); FSC := TFileStream.Create(String(FileNameTo), fmCreate); CompressStream(FSD, FSC); FreeAndNil(FSD); FreeAndNil(FSC); end; end; procedure CopyFileDecompress(FileNameFrom, FileNameTo: PWideChar); var FSC, FSD: TFileStream; EF: Boolean; begin FSC := TFileStream.Create(String(FileNameFrom), fmOpenRead); FSD := TFileStream.Create(String(FileNameTo), fmCreate); EF := not DecompressStream(FSC, FSD); FreeAndNil(FSC); FreeAndNil(FSD); if EF then CopyFile(FileNameFrom, FileNameTo, False); end; end. |
AW: zLib - FileIsCompressed
Super, danke!
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:55 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