| 
| Autor | Beitrag |  
| Raphael O. 
          Beiträge: 1596
 
 
 VS 2013
 
 | 
Verfasst: So 07.12.03 18:27 
 
da müsste man dann aus den Prozeduren Funktionen machen und denen dann jeweils ein Boolean rückgabetyp geben, den man im "except" eines "try-except"-Blocks auf false setzt und ganz am Anfang der Function auf true... |  |  |  
| obbschtkuche Gast
 Erhaltene Danke: 1
 
 
 
 
 | 
Verfasst: So 07.12.03 18:27 
 
Die Fehler werden nicht behandelt. Finally dient nur dazu später wieder aufzuräumen, wenn was schief geht. Eine Exception bekommst du trotzdem. |  |  |  
| mimi 
          Beiträge: 3458
 
 Ubuntu, Win XP
 Lazarus
 
 | 
Verfasst: So 07.12.03 19:24 
 
ja aber man sollte unterscheiden zwischen:
packer und Archivern.
 ich finde da gibst einen großen unterschied:
 Archiver:
 Achiviert nur dateien(als fast sie zusammen, wie tar)
 Packer, verkleinert dateien und als neben funktion archivert er sie auch.
 aber eigenltich kann er nur packen bzw. sollte dies können, wie das alte:
 _format.
 (was ist schon unter delphi 1 gab, was nur eine datei packen konnte und die dann so aussgehen hat: Datei._abc oder so änlich
 _________________ MFG
   Michael Springwald, "kann kein englisch...."
 |  |  |  
| datensender. Hält's aus hier
 Beiträge: 4
 
 Windows 2000 P / Gentoo
 D5 Enterprise
 
 | 
Verfasst: So 07.12.03 19:24 
 
@obbschtkuche
mhja richtig... dennoch könnte man auf einige Dinge im Vorfeld reagieren... z.B. bei DeCompressStream, ob sIn, sOut = nil sind... usw. und das dann erkenntlicher melden...
 _________________ "...haben uns verirrt, kommen aber gut voran" (Tom DeMarco)
 |  |  |  
| Laxans 
          Beiträge: 28
 
 
 
 
 | 
Verfasst: Fr 19.12.03 15:05 
 
Auf meinem Forular gibts ein 2 memofelder und n button
 klickt man auf den button:
 		                       Delphi-Quelltext 
 									| 1:2:
 3:
 4:
 
 | memo1.lines.Savetostream(ms1); CompressStream(ms1, ms2); decompressStream(ms2,ms3); memo2.lines.loadfromstream(ms3);					 |  Warum streht dann nicht in memo2 das gleiche wie in memo1 |  |  |  
| obbschtkuche Gast
 Erhaltene Danke: 1
 
 
 
 
 | 
Verfasst: Fr 19.12.03 15:25 
 
weil die Schreib/Leseposition von ms3 dann ganz am Ende ist. So funzts:
 		                       Delphi-Quelltext 
 									| 1:2:
 3:
 4:
 5:
 
 | memo1.lines.Savetostream(ms1); CompressStream(ms1, ms2); decompressStream(ms2,ms3); ms3.position := 0;memo2.lines.loadfromstream(ms3);
 |  |  |  |  
| FriFra 
          Beiträge: 557
 
 Win XP Prof, Win XP Home,Win Server 2003,Win 98SE,Win 2000,Win NT4,Win 3.11,Suse Linux 7.3 Prof,Suse Linux 8.0 Prof
 D2k5 Prof, D7 Prof, D5 Standard, D3 Prof, K3 Prof
 
 | 
Verfasst: Di 12.07.05 19:59 
 
Ich hab gerade mal etwas mit der Unit gespielt... dabei ist mir etwas merkwürdiges aufgefallen...
 Wenn ich eine Datei dekomprimiere
 		                       Delphi-Quelltext 
 									| 1:
 | DeCompressFile('c:\tritratrullalla.txt');					 |  und danach versuche in diese Datei zu schreiben, bekomme ich folgenden Fehler:  	  | Fehler hat folgendes geschrieben: |  	  | Datei c:\tritratrullalla.txt kann nicht geöffnet werden. Der Prozess kann nicht auf die Datei zugreifen, da sie von einem anderen Prozess verwendet wird. | 
 Kommentiere ich die Dekomrimierung aus, dann klappt alles... es liegt also definitiv an DeCompressFile! Nur warum, das verstehe ich nicht ganz, da die Datei ja im finally mit CloseFile geschlossen wird    ._________________ Michael
 (principal certified lotus professional - developer)
 |  |  |  
| FriFra 
          Beiträge: 557
 
 Win XP Prof, Win XP Home,Win Server 2003,Win 98SE,Win 2000,Win NT4,Win 3.11,Suse Linux 7.3 Prof,Suse Linux 8.0 Prof
 D2k5 Prof, D7 Prof, D5 Standard, D3 Prof, K3 Prof
 
 | 
Verfasst: Di 12.07.05 21:25 
 
Kleine Ergänzung...
 Das Problem tritt anscheinend nur auf, wenn die betreffende Datei nicht gepackt ist.
 _________________ Michael
 (principal certified lotus professional - developer)
 |  |  |  
| FriFra 
          Beiträge: 557
 
 Win XP Prof, Win XP Home,Win Server 2003,Win 98SE,Win 2000,Win NT4,Win 3.11,Suse Linux 7.3 Prof,Suse Linux 8.0 Prof
 D2k5 Prof, D7 Prof, D5 Standard, D3 Prof, K3 Prof
 
 | 
Verfasst: Di 12.07.05 21:43 
 
Ich habs gefunden    			Moderiert von									| 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:
 169:
 170:
 171:
 172:
 173:
 174:
 175:
 176:
 177:
 178:
 179:
 180:
 181:
 182:
 
 | unit Packer;
 
 interface
 
 uses Classes, Windows, SysUtils;
 
 procedure CompressFile(FileName: string); overload;
 procedure CompressFile(sfrom, sto: string); overload;
 procedure CompressFile(FileName: string; var pin: Pointer; pinsize: integer);
 overload;
 procedure DeCompressFile(FileName: string); overload;
 procedure DeCompressFile(sfrom, sto: string); overload;
 function DeCompressFile(filename: string; var pout: Pointer): integer; overload;
 
 procedure CompressStream(sIn, sOut: TStream);
 procedure DeCompressStream(sIn, sOut: TStream);
 
 implementation
 
 uses ZLib;
 
 function DeCompressFile(filename: string; var 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;
 
 procedure CompressFile(FileName: string; var 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);
 
 
 if pOut <> nil then
 freemem(pOut);
 finally
 if pIn <> nil then
 freemem(pIn);
 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);
 
 
 if pOut <> nil then
 freemem(pOut);
 
 finally
 if pIn <> nil then
 freemem(pIn);
 end;
 end;
 
 end.
 |   Christian S.: Code- durch Delphi-Tags ersetzt._________________ Michael
 (principal certified lotus professional - developer)
 |  |  |  
| Hux 
          Beiträge: 171
 
 
 
 
 | 
Verfasst: Mi 07.09.05 10:51 
 
Ola...,
 Ähm, ich habe noch eine Frage zu deiner Unit:
 Kann man eigentlich rausfinden ob eine datei mit dem Befehl:
 DeCompressFile('c:\haha.exe');
 komprimiert wurde?
 |  |  |  
| dalpers 
          Beiträge: 17
 
 
 
 
 | 
Verfasst: Mi 07.09.05 15:19 
 
Hi,
 Bin noch nicht so bedarft in dem Bereich. Ist es damit auch möglich Dateien so zu packen, dass man sie mit nem Standardprogramm wie winrar wieder entpacken kann?
 Irgendwie wird bei mir zwar die Datei verändert, aber ich kann sie danach nicht mehr irgendwie öffnen. Was mache ich falsch?
 
 Habe erstmal nur die funktion CompressFile mit einer Textdatei als Parameter aufgerufen.
 
 Hast du evtl.  mal ein Beispiel, wie man aus mehreren Dateien ein Archiv erstellt?
 
 Danke
 
 Denise
 |  |  |  
| Eddie 
          Beiträge: 58
 
 WinXP SP2
 Delphi 5 Standard,Delphi 2005 Architect
 
 | 
Verfasst: So 25.06.06 19:48 
 
Hi,
kann man mit den functions auch mehrere Dateien zu einem Archiv packen? Ich habe nämlich ein ListBox mit Dateien und die sollen alle in ein Archiv rein. Kann ich das evtl mit Streams machen? Aber wie bekomme ich mehrere Dateien in einen Stream?
 
 Ich hoffe mir kann das irgendeiner erklären oder sogar Beispiel-Quellcode geben.
 _________________ Der Programmierer ist nur ein Tool, dass Koffein in Code konvertiert.
 |  |  |  
| Timbo 
          Beiträge: 166
 
 
 
 
 | 
Verfasst: Mo 14.08.06 15:21 
 
Tach,
 ich benutze die CompressStream und DeCompressStream funktionen.
 Mir ist aufgefallen, dass danach im OutStream der Zeiger nicht am anfang steht, sollte man villeicht nach
 
 sOut.Write(pOut^, SizeWrite);
 
 mit
 
 sOut.Position:= 0;
 
 korigieren.
 
 Richtig?
 |  |  |  |