AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

zLib - FileIsCompressed

Ein Thema von stahli · begonnen am 8. Jul 2010 · letzter Beitrag vom 13. Jan 2013
 
Benutzerbild von stahli
stahli

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

AW: zLib - FileIsCompressed

  Alt 10. Jul 2010, 11: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 11:43 Uhr)
  Mit Zitat antworten Zitat
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:06 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