Autor Beitrag
F.Art
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 434



BeitragVerfasst: Sa 02.08.08 11:32 
die folgende procedur benutze ich um eine datei zu splitten.
nur habe derzeit das problem das ich mehrere dateien splitten muss ohne das sich die grösse der originalen datei verändert.
wie wird das für meine vorstellungen umgesetzt?


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:
procedure Split(Main_FileName, NewFromMain_Filename : string); 
var 
MainFile  : TFileStream; 
SplitFile : TFileStream; 
HelpStr   : string[10]; 
GetSize   : integer; 
begin 
MainFile    := TFileStream.create(Main_FileName, fmOpenRead or fmShareDenyWrite); 
try 
   SplitFile := TFileStream.Create(NewFromMain_Filename, fmCreate or fmShareDenyNone); 
   try 
     // Zu der Position gehen, wo die Größenangabe ist 
     // Streams fangen bie 0 an, d.h. 1. Byte = Index 0!!! 
     MainFile.Position   := MainFile.Size - 11;
     // Länge der angehängten Datei einlesen 
     MainFile.Read(HelpStr, 10); 
     // Länge in String konvertieren (würde ich anders machen, aber dann müsstest dua cuh die andere Proc ändern) 
     GetSize := StrToInt(HelpStr); 
     // Zu der Stelle gehen, wo die angehängte Datei anfängt 
     MainFile.Position := GetSize; 
     // Angehängte Datei rauskopieren 
     SplitFile.CopyFrom(MainFile, MainFile.Size-GetSize); 
     // Neue Datei kürzen, da auch noch die Längenangabe dran ist 
     SplitFile.Size := SplitFile.Size - 11;
     // Wiese Zeile würde jetzt die angeh. Datei löschen 
     {MainFile.Size :=  GetSize;} 
   finally
    SplitFile.Free;
   end; 
finally 
  MainFile.Free; 
end; 
end;




ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
procedure TForm1.Button2Click(Sender: TObject);
begin
Split('Anwendung.exe', '1.dll');
Split('Anwendung.exe', '2.dll');
Split('Anwendung.exe', '3.txt');
end;
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Sa 02.08.08 22:48 
Ich habe dein Problem nicht verstanden, aber was ist das:
ausblenden Delphi-Quelltext
1:
2:
3:
MainFile.Position   := MainFile.Size - 11;
// Länge der angehängten Datei einlesen 
MainFile.Read(HelpStr, 10);


Warum steht die Länge der angehängten Datei nicht als Integer am Ende der Datei?

ausblenden Delphi-Quelltext
1:
2:
3:
MainFile.Position   := MainFile.Size - sizeof(Integer);
// Länge der angehängten Datei einlesen 
MainFile.Read(SizeOfFile, sizeof(Integer));
F.Art Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 434



BeitragVerfasst: So 03.08.08 00:18 
warum es nicht als integer steht das weis ich nicht. hatte den code irgendwann aus dem netz.
mein problem ist, dass er immer nur die letzt angehängte datei extrahiert, aber ich möchte auch die anderen heraus holen.
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: So 03.08.08 00:28 
Ja wie ist das denn aufgebaut?

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
exe
datei1
längedatei1
datei2
längedatei2
...


Oder wie?
F.Art Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 434



BeitragVerfasst: So 03.08.08 10:17 
Hier die Prozedur zum joinen.

ausblenden 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:
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;
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: So 03.08.08 21:31 
Also so wie ich es vermutet habe?

Na dann guck dir das doch mal auf einem Blattpapier an. Wenn du die erste Datei haben willst, liest du die Dateigröße der zweiten (und in diesem Fall letzten Datei) aus. Dann gehst du so viele Bytes in deiner Gesamtdatei zurück + die Länge der Größeninformation der ersten Datei und liest die Größe der ersten Datei aus. Dann gehst du wieder die entsprechende Anzahl Bytes zurück und leist ab da so viele Bytes, wie die Datei lang ist und schreibst sie auf die Festplatte.

Das kann man geschickt kapsel, so dass du am Schluss eine Routine hat, der du nur die Gesamtdatei angibst und die wievielte Datei du extrahieren möchtest:
ausblenden Delphi-Quelltext
1:
procedure ExtractFile(MainFilename: string; Index: Integer; DestFilename: string);					

Wenn du das hast, kannst du einfach diese Routine in einer Schleife aufrufen und so alle Dateien extrahieren.

Du kannst dir auch mal mein Selbstentpackedes Archiv angucken: www.michael-puff.de/...er/Delphi/Programme/ -> SFXTools, da mache ich was ähnliches.