Einzelnen Beitrag anzeigen

Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.343 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: zLib - FileIsCompressed

  Alt 10. Jul 2010, 12:40
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.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)

Geändert von stahli (10. Jul 2010 um 12:43 Uhr)
  Mit Zitat antworten Zitat