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
Antwort Antwort
Benutzerbild von stahli
stahli

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

zLib - FileIsCompressed

  Alt 8. Jul 2010, 11:58
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.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: zLib - FileIsCompressed

  Alt 8. Jul 2010, 12:00
Am Header der Datei
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.157 Beiträge
 
Delphi 12 Athens
 
#3

AW: zLib - FileIsCompressed

  Alt 8. Jul 2010, 16:44
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.337 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
Paulman

Registriert seit: 11. Dez 2012
15 Beiträge
 
#5

AW: zLib - FileIsCompressed

  Alt 13. Jan 2013, 10:31
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 if EF then CopyFile(FileNameFrom, FileNameTo, False); 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.
Nun hab ich aber tatsächlich eine unkompriemierte Datei geladen, damit kriege ich sofort eine exeption bei EF := not DecompressStream(FSC, FSD); Was mich auch wundert, ist die Meldung "Variable 'ds' ist möglicherweise nicht initialisiert worden".

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!
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

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

AW: zLib - FileIsCompressed

  Alt 13. Jan 2013, 12: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
Paulman

Registriert seit: 11. Dez 2012
15 Beiträge
 
#7

AW: zLib - FileIsCompressed

  Alt 13. Jan 2013, 21:23
Super, danke!
  Mit Zitat antworten Zitat
Antwort Antwort


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 04:23 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz