Einzelnen Beitrag anzeigen

Benutzerbild von stahli
stahli

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

AW: zLib - FileIsCompressed

  Alt 13. Jan 2013, 13:46
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.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat