Entwickler-Ecke

Dateizugriff - Zlib [done]


cromos - Di 16.09.03 15:08
Titel: Zlib [done]
Hallo.

ich möchte alle Dateien die sich in einem bestimmten Verzeichnis befinden zu einer zusammenfassen. (komprimieren) Und danach natürlich auch wieder dekomprimieren. Ich benötige ein Beispiel für die Unit Zlib wie ich den Ordner komprimiere und auch wieder dekompimiere.

Gruss
Cromos


Anonymous - Di 16.09.03 15:17

HiH :o
ZLib ist zum kompremieren von einer Datei :D Du kannst aber immer eine in das Archiv hinzufügen ;)
Schreib doch einfach eine Schleife die die Dateien alle in dein Archiv hinzufügt :D

:wave:, sCrAPt


cromos - Di 16.09.03 17:34

Hi,

wie schreibe ich denn eine Datei in das Archiv??


mimi - Di 16.09.03 17:40

dabei bin ich gerade, wenn du willst kannst du ja mitmachen:
http://www.delphi-forum.de/viewtopic.php?p=95672#95672

und wenn nicht, einfach mal nach TStream suchen bzw. informieren *G*
das ist garnicht mal so einfach.


cromos - Mi 17.09.03 01:04

Hallo.

Zitat:

dabei bin ich gerade, wenn du willst kannst du ja mitmachen:


Also das ist es nicht was ich suche. Ich will auch keinen Packer oder ähnliches Programmieren. Ich brauche die Funktion nur für ein Tools was eigendlich nichts mit Komprimieren oder packen zu tun hat.

Ich habe eine Verzeichnisstruktur, die möchte ich in eine Datei schreiben, später natürlich wieder extrahieren. Ob es dann komprimiert ist, ist eigendlich egal. Wäre aber ein schöner nebenefekt.

Also geht das, und wenn ja bitte wie? Ich weiss. Zlib, Streams usw. Ich brauche aber konkrete Beispiele. Von mir aus kann es auch eine Freeware Kompo sein.

Gruss
Cromos


Anonymous - Mi 17.09.03 12:58

Den Code ohne Kompremierung hab ich:
Dateien miteinander verschmelzen

Wer einen Installer unter Delphi schreiben möchte, wird vielleicht eine Methode vermissen, mit denen man Files verschmelzen und wieder trennen kann. Dies kann man mit beiden Prozeduren erreichen.
Join dient zum verschmelzen der beiden Dateien und Split trennt beide wieder.
Nach dem verschmelzen ist die Hauptfile immer noch voll ausführbar (wenn sie keinen CRC Check oder so was besitzt) und die 2. Datei in der Hauptdatei drin.
Beim Aufruf von Split wird die 2. Datei aus der 1. angelegt und die 1. Datei verkürzt.



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:
procedure Join (Main_FileName, Hidden_Filename : string);
var
 MainFile    : TFileStream;
 HiddenFile  : TFileStream;
 SizeOfFile  : Cardinal;
 SearchWord  : string[10];
begin
 MainFile       := TFileStream.Create(Main_FileName, fmOpenReadWrite or fmShareDenyWrite);
 try
   SizeOfFile     := MainFile.Size;
   HiddenFile     := TFileStream.Create(Hidden_Filename, fmOpenRead or fmShareDenyNone);
   try
     MainFile.Seek(0, soFromEnd);
     MainFile.CopyFrom(HiddenFile, 0);
     MainFile.Seek(0, soFromEnd);
   finally
    HiddenFile.Free;
   end;
   SearchWord := IntToStr(SizeOfFile) + #0;
   MainFile.Seek(0, soFromEnd);
   MainFile.WriteBuffer(SearchWord, SizeOf(SearchWord));
 finally
  MainFile.Free;
 end;
end;

procedure Split(Main_FileName, NewFromMain_Filename : string);
var
 MainFile  : TFileStream;
 SplitFile : TFileStream;
 HelpStr   : string[10];
 GetSize   : integer;
begin
 MainFile    := TFileStream.create(Main_FileName, fmOpenReadWrite or fmShareDenyWrite);
 try
   SplitFile := TFileStream.Create(NewFromMain_Filename, fmCreate or fmShareDenyNone);
   try
     MainFile.Position   := MainFile.Size - 11;
     MainFile.Read(HelpStr, 10);
     GetSize := StrToInt(HelpStr);
     MainFile.Position := GetSize;
     SplitFile.CopyFrom(MainFile, MainFile.Size-GetSize);
     SplitFile.Size := SplitFile.Size - 11;
     MainFile.Size :=  GetSize;
   finally
    SplitFile.Free;
   end;
 finally
  MainFile.Free;
 end;
end;



Das Verschmelzen der Dateien erfolgt so:


Delphi-Quelltext
1:
  Join('C:\Datei.exe', 'C:\ReadMe.txt');                    


Und das Trennen mit folgendem Aufruf(wenn Datei.exe die zusammengeschmolzene Datei ist):


Delphi-Quelltext
1:
  Split('C:\Datei.exe', 'C:\TheHidden.txt');                    



Von: Manuel Wiersch


chris_davidi - Mi 17.09.03 13:01

Hm, und wie wäre es mit der ZipMaster- Komponente, dass Archiv-Format wäre dann ZIP und man kann eben packen und entpacken lassen mit ein paar Zeilen Quellcode...


cromos - Mi 17.09.03 13:25

Zitat:

Hm, und wie wäre es mit der ZipMaster- Komponente, dass Archiv-Format wäre dann ZIP und man kann eben packen und entpacken lassen mit ein paar Zeilen Quellcode...


Wo bekomme ich die her. Ist es Freeware?

@sCrAPt:

Hm. Ich weiss nicht ob es das ist was ich will. ich muss eine Verzeichnis strucktur inkl. aller Dateien und der Unterordner "Zusammenführen".
Mit Deinem Code kann ich ja nur 2 Dateien miteinader "Verschmelzen".
Und selbt wenn es mit mehreren gehen würde. Die Verzeichnisstruktur kann ich ja so nicht mitnehmen.
Ich glaube eine Zip-Komp wäre wohl eher das was ich brauche. Am besten Freeware.

Gruss
Cromos


Delete - Mi 17.09.03 13:28

@scrapt: Das ist eins zu eins aus dem EDH oder?


cromos - Mi 17.09.03 13:38

Hallo,

OK. Ich habe mir jetzt mal die ZipMaster Kompo runtergeladen.
Nur ist es so das ich noch nie eine fremde Komponennte unter Delphi genutzt habe. Deshlab weiss ich auch nicht wie ich die in Delphi einbinde.
Bzw. welche von den vielen Dateien ich in Delphi einbinden muss.
Und wo ????


Tino - Mi 17.09.03 13:40

Gibt es da keine Readme Datei?

Gruß
Tino


cromos - Mi 17.09.03 15:47

Ja. Da ist tatsächlich eine. Nur leider gibt es die Dateien die da drin stehen nicht alle.
:?:

Was ich nicht verstehe: Warum muss das immer so kompliziert sein?
Andere Leute können sotwas auch mit einem Setup ausliefern :evil:

Jedenfalls für mich als Delphi-Anfänger schwer verständlich.
Ich verstehe es wirklich nicht. Warum kann ein Programmierer der es schafft eine warscheinlich richtig gute Kompo zu erstellen es nicht schaffen ein Setup dafür zu generieren :?:

Jednfalls weiss ich nicht wie ich die Installieren soll.


cromos - Mi 17.09.03 16:19

So, hab jetzt mal versucht das ganze über die Delphi IDE zu installieren.

Habe da auch eine Art Anleitung im Internet gefunden.
Nur leider klappt das auch nicht.

Fehler:

Quelltext
1:
[Fataler Fehler] ZipMstr.pas(29): Datei nicht gefunden: 'ZipSFX.dcu'                    


Die Datei existiert auch nicht auf meinem Computer.
Keine Ahnung. Finde das ganze sehr verwirrend. :roll:


superchatti - Mi 17.09.03 17:03

Ich bräuchte mal den Befehl fürs zippen mit ZLib!


mimi - Mi 17.09.03 17:15

@cromos
suche mal nach der datei und und speichere den pfad in der delphi IDE unter tools\umgebens...\verzeichnise\lib verzeichnis


cromos - Mi 17.09.03 17:28

Zitat:

suche mal nach der datei und und speichere den pfad in der delphi IDE unter tools\umgebens...\verzeichnise\lib verzeichnis


Die Datei existiert auf meinem Rechner nicht.


mimi - Mi 17.09.03 17:40

muss aber, wenn nicht hast du nicht die besagte komponente.
such mal auf dem gesammte fesplate noch ZipSFX.dcu dann solltes du sie finden


cromos - Mi 17.09.03 20:54

Also bei mir exestier keine Datei mit diesem Namen. Auch nicht mit einem
ähnlichen.

Das ist die richtige Kompo.
ZipMaster von dieser Seite:


http://www.geocities.com/rjpeters_au/zipmaster.html

Habe mir das Full-Archiv runtergeladen.
Es kann nur sein das das Archiv fehlerhaft ist.


cromos - Mi 17.09.03 21:37

Ok. Nach langem hin un her, habe ich es glaube ich geschaft.
Ich musste eine Datei umbenennen. Und etwas umkopieren etc.
(Ich verstehe trotzdem nicht wie das kompliziert gemacht ist)

Na ja. Jetzt haben ich einen Reiter in der Delphi IDE mit der Zip un Unzip Kompo.

Ich wollte eine Zip Datei erstellen. Leider geht es nicht.
hier der Code:


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:
procedure TForm15.btnSavePaketClick(Sender: TObject);
var ProgrammOrdner : String;
var res: Integer;

ds: TSearchRec;



begin
ProgrammOrdner:=ExtractFilePath(application.ExeName);
with SaveDialog1 do
  begin
    FileName:= Form1.lblKontakt.Caption + '.tdt';
    Title:='Datenaustauschdatei Speichern unter:';
    Filter:='EST Terminator Datentauschdatei (TDT)|*.TDT';
    defaultExt:='TDT';
    InitialDir:=ExtractFilePath(ParamStr(0));
    if Execute then
    begin
      //Mach was
       
          Zipmaster1.DLLDirectory:=ExtractFilePath(ParamStr(0));
          Zipmaster1.ZipFilename:=ExtractFilePath(ParamStr(0))+ 'Test.zip';
          

          res := FindFirst(ProgrammOrdner + 'Data\' + Form1.lblKontakt.caption + '\*.estt',faAnyFile,ds);
          while(res =0) do begin
          //Dem Archiv hinzufügen
          Zipmaster1.FSpecArgs.Add(ds.name);
          res := FindNext(ds);
          end;
          FindClose(ds);

          Zipmaster1.Add;


        
       
     end
    else
       exit;
    end;



end;


Anstatt 'Test.Zip' sollte natürlich SaveDialog1.FileName da stehen. Sollte nur zum Testten sein.

Wenn ich es so mach passier gar nichts.
Wenn ich SaveDialog1.FileName hinschreibe, dann bricht das Programm mit einem Fehler ab. (Exception - ZipMaster 10308)

Kann mir da jemand helfen?

Gruss
Cromos


mimi - Mi 17.09.03 22:23

1. das else hinte dem ersten if ist sinlos das kannst du löschen.
2. was soll passieren ? soll eine neue zip datei erstellt werden(sieht
danach aus)
weiß garnicht mehr wie das war, aber da ist ein beipsiel progamm dabei.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
res := FindFirst(ProgrammOrdner + 'Data\' + Form1.lblKontakt.caption + '\*.estt',faAnyFile,ds); 
          while(res =0) do begin 
          //Dem Archiv hinzufügen 
          Zipmaster1.FSpecArgs.Add(ds.name); 
          res := FindNext(ds); 
          end; 
          FindClose(ds);

das kannst du dir auch sparen und einfach hinschreiben:
Zipmaster1.FSpecArgs.add(ProgrammOrdner + 'Data\' + Form1.lblKontakt.caption + '\*.estt');
sollte funktionieren.

ansonsten rate ich dir das beispiel progamm anzuschauen.


cromos - Do 18.09.03 01:05

Hallo,

OK. Das Packen der Daten funktioniert jetzt.

Nur beim Entpacken habe ich Probleme.

Ich bekomme vom Programm die Fehlermeldung:

Zitat:

ZipMsgXX.res is probably not linked to the executable. Missing String ID is
11001


Muss ich die besagte Datei ins Programmverzeichnis kopieren?
Geht aber auch nicht.
:?:


cromos - Do 18.09.03 10:41

Ok. Hab es geschafft.

Sorry wegen der blöden Frage gestern. Klar musste ich die Resource mitkompilieren. (Kleines Blackout´- Zu lange am Rechner :D )


superchatti - Do 18.09.03 18:05

ICH BRAUCHE HILFE!

Ich kann mir da nichts runterladen, denn mein IE kaggt nur auf der Seite ab!

mimi??

Kannst du mir das ZIP schicken??
BITTE!

:wink:

:oops: