![]() |
Joinen und Splitten von Dateien
Hallo, mit folgendem Code habe ich 1 (eine) Textdatei in eine EXE gepackt.
Delphi-Quellcode:
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; // Aufruf Join('C:\Datei.exe', 'C:\ReadMe.txt');
Delphi-Quellcode:
Das Problem ist, dass ich gerne 2 (zwei) Dateien in die Exe packen möchte, ich habe es so probiert:
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; // Aufruf Split('C:\Datei.exe', 'C:\TheHidden.txt');
Delphi-Quellcode:
Das klappt glaube ich soweit.
procedure Join(Main_FileName,
Hidden_Filename, Hidden_Filename2 : string); {Hidden_Filename2} var MainFile : TFileStream; HiddenFile : TFileStream; HiddenFile2 : TFileStream; {neu} 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); // neu HiddenFile2 := TFileStream.Create (Hidden_Filename2, fmOpenRead or fmShareDenyNone); try MainFile.Seek(0, soFromEnd); MainFile.CopyFrom(HiddenFile, 0); // neu MainFile.CopyFrom(HiddenFile2, 0); MainFile.Seek(0, soFromEnd); finally HiddenFile.Free; HiddenFile2.Free; {neu} end; SearchWord := IntToStr(SizeOfFile) + #0; MainFile.Seek(0, soFromEnd); MainFile.WriteBuffer(SearchWord, SizeOf(SearchWord)); finally MainFile.Free; end; end; Jetzt möchte ich es aber Splitten, das habe ich so versucht:
Delphi-Quellcode:
Das klappt leider nicht, denn die DLL die ich "verpacke" hat am Ende 0 Byte und ist laut Windows "keine DLL-Datei" mehr.
procedure Split(Main_FileName,
NewFromMain_Filename, NewFromMain_Filename2: string); var MainFile : TFileStream; SplitFile : TFileStream; SplitFile2 : TFileStream; HelpStr : string[10]; GetSize : integer; begin MainFile := TFileStream.create (Main_FileName, fmOpenReadWrite or fmShareDenyWrite); try SplitFile := TFileStream.Create (NewFromMain_Filename, fmCreate or fmShareDenyNone); SplitFile2 := TFileStream.Create (NewFromMain_Filename2, 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; SplitFile2.CopyFrom(MainFile, MainFile.Size-GetSize); SplitFile2.Size := SplitFile2.Size - 11; MainFile.Size := GetSize; finally SplitFile.Free; SplitFile2.Free; end; finally MainFile.Free; end; end; Was mache ich falsch? |
Re: Joinen und Splitten von Dateien
Kennt keiner eine Antwort?
|
Re: Joinen und Splitten von Dateien
Hallo Tommy,
um mehr als eine Datei an eine EXE-Datei anhängen zu können musst du mehr als nur die Größe der Echse speichern. Die könntest du sogar aus dem PE-Header ableiten, aber nehmen wir ruhig an, dass du sie weiterhin ans Ende schreibst. Ich würde dann folgendes Format vorschlagen. Die wesentlichen Abschnitte der Datei fasse ich in eckige Klammern: [EXE] [SIZE-1] [FILE-1] [SIZE-2] [FILE-2] [SIZE-EXE] Außerdem würde ich die Größenangaben gleich als DWORD oder QWORD schreiben. So solltest du keine Probleme haben deine Dateien wieder zu extrahieren. Eventuell möchtest du sogar die Relativnamen mit abspeichern: [EXE] [SIZE-0] [NAME-TABLE] [SIZE-1] [FILE-1] [SIZE-2] [FILE-2] [SIZE-EXE] Die NAME-TABLE könntest du in Form des Process Environment speichern: Jeder Eintrag wird als NUL terminierter String gespeichert, der letzte String ist ein leerer. Eine mögliche Alternative zu dieser Vorgehensweise stellen Alternate Data Streams dar. Grüße vom marabu |
Re: Joinen und Splitten von Dateien
Mhh.. das ist dann ja so:
Ich packe einige Sachen in eine EXE-Datei (BspName: Test.exe). Die Exe-Datei Test.exe kann ich dann nicht mehr zum Splitten verwenden, da sie "in Benutzung" ist. Gibt es da eine Möglichkeit, diesen Fehler zu umgehen, dass ich also eine EXE habe mit all meinen Sachen drin? |
Re: Joinen und Splitten von Dateien
Hallo,
wenn du beim "Splitten" die gerade ausgeführte Echse mit fmOpenReadWrite öffnest, kann ich mir deine Schwierigkeiten gut vorstellen. Probiere es doch mal mit fmOpenRead. Als Resourcen möchtest du deine Dateien nicht einbinden? Und die DLL einfach ohne Hokus-Pokus mit installieren geht auch nicht? Freundliche Grüße |
Re: Joinen und Splitten von Dateien
Zitat:
|
Re: Joinen und Splitten von Dateien
Wenn ich bei beiden Prozeduren (Join und Split)
aus fmOpenReadWrite dann fmOpenRead mache, und die EXE ausführen will, erhalte ich die Fehlermeldung: Stream-Schreibfehler: Mein Code: Join:
Delphi-Quellcode:
HauptECHSE soll ZusatzECHSE "joinen" doch Stream-Schreibfehler.
ExePfad := ExtractFilePath(Application.ExeName);
Join(ExePfad+'HauptECHSE.exe', ExePfad+'ZusatzECHSE.exe'); |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:40 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz