Autor Beitrag
obbschtkuche
Gast
Erhaltene Danke: 1



BeitragVerfasst: Mi 12.11.03 15:57 
Diese Unit vereinfacht die Verwendung von ZLib.

folgende Procedures stehen zur Verfügung:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
procedure CompressFile(FileName: string); overload;
procedure CompressFile(sfrom, sto: string); overload;
procedure CompressFile(FileName: stringvar pin: Pointer; pinsize: integer); overload;

procedure DeCompressFile(FileName: string); overload;
procedure DeCompressFile(sfrom, sto: string); overload;
function DeCompressFile(filename: stringvar pout: Pointer): integer; overload;

procedure CompressStream(sIn, sOut: TStream);
procedure DeCompressStream(sIn, sOut: TStream);


CompressFile kann mit einem String aufgerufen werden, dann wird die Datei komprimiert und unter dem selben Namen abgespeichert.
Mit 2 Strings wird die Datei "sfrom" komprimiert unter "sto" gespeichert.
Mit einem String, einem Pointer und einem Integer wird der Inhalt des Pointers Komprimiert in der Datei "FileName" gespeichert. pinsize ist die größe des Pointers.
Mit DeCompressFile verhält es sich umgekehrt.

DeCompressFile mit einem string und einem Pointer gibt die Größe des Pointers zurück.

CompressStream komprimiert einen Stream, DecompressStream dekomprimiert ihn wieder.

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
// V 1.0 By Obbschtkuche

unit Packer;

interface

uses Classes, Windows;

procedure CompressFile(FileName: string); overload;
procedure CompressFile(sfrom, sto: string); overload;
procedure CompressFile(FileName: stringvar pin: Pointer; pinsize: integer); overload;
procedure DeCompressFile(FileName: string); overload;
procedure DeCompressFile(sfrom, sto: string); overload;
function DeCompressFile(filename: stringvar pout: Pointer): integer; overload;

procedure CompressStream(sIn, sOut: TStream);
procedure DeCompressStream(sIn, sOut: TStream);

function FileExists(const FileName: string): Boolean;

implementation

uses ZLib;

function DeCompressFile(filename: stringvar pout: Pointer): integer; 
var
 f: File of byte;
 pIn: Pointer;
 sizeRead,sizeWrite: integer;
begin
 pIn := nil; pOut := nil;
 assignfile(f, FileName);
 reset(f);
 try
  getmem(pIn, FileSize(f));
  BlockRead(f, pIn^, FileSize(f), sizeRead);
  DeCompressBuf(pIn, sizeRead, sizeRead, pOut, sizeWrite);
  result := sizeWrite;
 finally
  if pIn <> nil then freemem(pIn);
  CloseFile(f);
 end;
end;

function FileExists(const FileName: string): Boolean;
var
  f: TWin32FindData;
  handle: THandle;
begin
  handle := FindFirstFile(pChar(FileName), f);
  result := (handle <> INVALID_HANDLE_VALUE);
  FindClose(Handle);
end;

procedure CompressFile(FileName: stringvar pin: Pointer; pinsize: integer);
var
 f: File of byte;
 pOut: Pointer;
 sizeWrite: integer;
begin
 pOut := nil;
 assignfile(f, FileName);
 try
  CompressBuf(pIn, pinsize, pOut, sizeWrite);
  ReWrite(f);
  BlockWrite(f, pOut^, sizeWrite);
 finally
  if pOut <> nil then freemem(pOut);
  CloseFile(f);
 end;
end;


procedure CompressFile(FileName: string); overload;
var
 f: File of byte;
 pIn,pOut: Pointer;
 sizeRead,sizeWrite: integer;
begin
 pIn := nil; pOut := nil;
 assignfile(f, FileName);
 reset(f);
 try
  getmem(pIn, FileSize(f));
  BlockRead(f, pIn^, FileSize(f), sizeRead);
  CompressBuf(pIn, sizeRead, pOut, sizeWrite);
  ReWrite(f);
  BlockWrite(f, pOut^, sizeWrite);
 finally
  if pIn <> nil then freemem(pIn);
  if pOut <> nil then freemem(pOut);
  CloseFile(f);
 end;
end;

procedure DeCompressFile(FileName: string); overload;
var
 f: File of byte;
 pIn,pOut: Pointer;
 sizeRead,sizeWrite: integer;
begin
 pIn := nil; pOut := nil;
 assignfile(f, FileName);
 reset(f);
 try
  getmem(pIn, FileSize(f));
  BlockRead(f, pIn^, FileSize(f), sizeRead);
  DeCompressBuf(pIn, sizeRead, sizeRead, pOut, sizeWrite);
  ReWrite(f);
  BlockWrite(f, pOut^, sizeWrite);
 finally
  if pIn <> nil then freemem(pIn);
  if pOut <> nil then freemem(pOut);
  CloseFile(f);
 end;
end;

procedure CompressFile(sfrom, sto: string); overload;
begin
 if FileExists(sto) then DeleteFile(pchar(sto));
 CopyFile(pchar(sfrom), pchar(sto), true);
 CompressFile(sto);
end;

procedure DeCompressFile(sfrom, sto: string); overload;
begin
 if FileExists(sto) then DeleteFile(pchar(sto));
 CopyFile(pchar(sfrom), pchar(sto), true);
 DeCompressFile(sto);
end;

procedure CompressStream(sIn, sOut: TStream);
var
 pIn,pOut: Pointer;
 sizeRead,sizeWrite: integer;
begin
 pIn := nil; pOut := nil;
 try
  getmem(pIn, sIn.size);
  sIn.Position := 0;
  sizeRead := sIn.Read(pIn^, sIn.Size);
  CompressBuf(pIn, sizeRead, pOut, sizeWrite);
  sOut.Write(pOut^, sizeWrite);
 finally
  if pIn <> nil then freemem(pIn);
  if pOut <> nil then freemem(pOut);
 end;
end;

procedure DeCompressStream(sIn, sOut: TStream);
var
 pIn,pOut: Pointer;
 sizeRead,sizeWrite: integer;
begin
 pIn := nil; pOut := nil;
 try
  getmem(pIn, sIn.size);
  sIn.Position := 0;
  sizeRead := sIn.Read(pIn^, sIn.Size);
  DecompressBuf(pIn, sizeRead, sizeRead, pOut, sizeWrite);
  sOut.Write(pOut^, sizeWrite);
 finally
  if pIn <> nil then freemem(pIn);
  if pOut <> nil then freemem(pOut);
 end;
end;

end.


Zuletzt bearbeitet von obbschtkuche am Mi 12.11.03 17:00, insgesamt 6-mal bearbeitet
Udontknow
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: Mi 12.11.03 16:33 
Hallo!

Woran erkenne ich bei der Routine "procedure DeCompressFile(filename: string; var pout: Pointer)", wieviele Bytes nun zu lesen sind?
Ich bevorzuge eine Ausgabe in einem Stream. Muss ich heute abend an meinem PC noch mal kramen.

Die Routinen CompressFile(procedure CompressFile(sfrom, sto: string); und ihr DecompressFile-Pendant sollten so abgeändert werden, daß die Datei nicht gelöscht wird, wenn sfrom=sto ist.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
procedure CompressFile(sfrom, sto: string); overload
begin 
 if sfrom<>sto then
 begin
   if FileExists(sto) then DeleteFile(pchar(sto)); 
   CopyFile(pchar(sfrom), pchar(sto), true); 
 end;
 CompressFile(sto); 
end;


Cu, :)
Udontknow
obbschtkuche
Gast
Erhaltene Danke: 1



BeitragVerfasst: Mi 12.11.03 16:56 
So ich habe mal einiges upgedatet.
Stream-Funktionen habe ich auch, aber die sind da nicht drin... vielleicht mache ich sie gleich noch rein...
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 12.11.03 18:18 
Du machst immer alles auf einen Schlag:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
procedure CompressFile(FileName: string); overload
var 
 f: File of byte; 
 pIn,pOut: Pointer; 
 sizeRead,sizeWrite: integer; 
begin 
 pIn := nil; pOut := nil
 assignfile(f, FileName); 
 reset(f); 
 try 
  getmem(pIn, FileSize(f)); 
  BlockRead(f, pIn^, FileSize(f), sizeRead); 
  CompressBuf(pIn, sizeRead, pOut, sizeWrite); 
  ReWrite(f); 
  BlockWrite(f, pOut^, sizeWrite); 
 finally 
  if pIn <> nil then freemem(pIn); 
  if pOut <> nil then freemem(pOut); 
  CloseFile(f); 
 end
end;

Das ist schlecht. Man kann es dann nämlich nicht mehr abbrechen und eien Fortschrittsanzeige läßt sich so auch nicht implementieren. Besser wäre es das ganze in eine Schleife zu packen und sich aus der Schleife eine Nachricht schicken zu lassen, wie weit er ist.
obbschtkuche
Gast
Erhaltene Danke: 1



BeitragVerfasst: Mi 12.11.03 21:53 
Das ganze braucht bis auf CompressBuf bzw. DeCompressBuf praktisch keine Zeit. Und gerade dabei ist das leider nicht möglich :(
Udontknow
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: Mi 12.11.03 22:56 
Dann benutze doch besser die TCompressionStream-Klasse, die schon in der Unit ZLib drin ist. Da gibt es auch, wenn ich mich nicht irre, ein OnProgress-Event o.ä. .

CU,
Udontknow
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 13.11.03 16:47 
obbschtkuche hat folgendes geschrieben:
Das ganze braucht bis auf CompressBuf bzw. DeCompressBuf praktisch keine Zeit. Und gerade dabei ist das leider nicht möglich :(

Hast du es auch schon mit meherem 100 MB großen dateien getestet?
obbschtkuche
Gast
Erhaltene Danke: 1



BeitragVerfasst: Do 13.11.03 17:02 
Naja, da hast du Recht, aber es bringt trotzdem nicht viel, wenn man 2-3x eine Callback-fkt aufruft.
Mit der Stream-Klasse ließe es sich wahrscheinlich schon machen, aber ich habe die Procs nicht für mehrere 100MB große Dateien geschrieben, und wer solche Dateien (ent)packen will hat dann eben in diesem Fall Pech gehabt. :evil:
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 13.11.03 17:07 
Kunde ist König - oder wie heißt das in der Servicewüste Deutschland? :roll:
obbschtkuche
Gast
Erhaltene Danke: 1



BeitragVerfasst: Do 13.11.03 17:10 
hrhr... Dann will ich aber auch Geld sehen ;)

Tut uns leid, in diesem Fall können wir Ihnen leider nicht weiterhelfen. Sollten Sie eine Lösung für Ihr Problem finden, wären wir Ihnen dankbar, wenn sie die Lösung hier veröffentlichen würden
mimi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3458

Ubuntu, Win XP
Lazarus
BeitragVerfasst: So 07.12.03 14:01 
@obbschtkuche
man packt doch nicht kleine dateien sondern große, oderr nicht ???

_________________
MFG
Michael Springwald, "kann kein englisch...."
ixtreme
Gast
Erhaltene Danke: 1



BeitragVerfasst: So 07.12.03 14:23 
@mini: willst du das pauschalisieren?
mimi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3458

Ubuntu, Win XP
Lazarus
BeitragVerfasst: So 07.12.03 16:58 
was heißt "pauschalisieren" ????

_________________
MFG
Michael Springwald, "kann kein englisch...."
Raphael O.
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1596


VS 2013
BeitragVerfasst: So 07.12.03 16:58 
pauschalisieren = verallgemeinern
mimi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3458

Ubuntu, Win XP
Lazarus
BeitragVerfasst: So 07.12.03 17:14 
achso, aber ich verstehe jetzt nur den zusammen hang mit meinem ersten beirag nicht so ganz, was hat es damit zu tuen?

_________________
MFG
Michael Springwald, "kann kein englisch...."
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: So 07.12.03 17:23 
Man kann nicht pauschal sagen, dass man nur große Dateien packt. Es mahct auch Sinn für den Transport oder aus sonst welchen Gründen viele kleine Dateien zu einem archiv zusammen zu packen.
mimi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3458

Ubuntu, Win XP
Lazarus
BeitragVerfasst: So 07.12.03 18:18 
ja ok, luckie du hast recht.
aber ein pack programm wurde nur für den zweck geschrieben eine große datei zu verkleinrn. mehr nicht.

_________________
MFG
Michael Springwald, "kann kein englisch...."
Raphael O.
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1596


VS 2013
BeitragVerfasst: So 07.12.03 18:21 
nicht unbedingt...
wei Luckie schon gebrauchen um mehrere Dateien zu einer "zusammenzufügen"
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: So 07.12.03 18:34 
Man spricht ja auch von Archiven, wenn man Dateien redet, die von Packern erstellt wurden. Und in einem Archiv sind nun mal viele Dokumente zusammen gefasst aufbewart.
datensender.
Hält's aus hier
Beiträge: 4

Windows 2000 P / Gentoo
D5 Enterprise
BeitragVerfasst: So 07.12.03 19:07 
mal eine ganz allgemeine Frage... woran erkennt man, ob eine deiner Prozeduren erfolgreich ausgeführt wurde oder scheiterte?

Ich habe die Quellen zwar nur überflogen, aber ich finde keine Rückgabewerte, Exceptions usw. vor. Es werden zwar Probleme
prozedur-intern abgefgangen, was hier aber nichts daran ändert,
dass die Operation dennoch fehlgeschlagen ist...
Das wird nach aussen hin aber nicht transparent...

_________________
"...haben uns verirrt, kommen aber gut voran" (Tom DeMarco)