Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Joinen und Splitten von Dateien (https://www.delphipraxis.net/96616-joinen-und-splitten-von-dateien.html)

Tommy1988 27. Jul 2007 14:02


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:
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');
Das Problem ist, dass ich gerne 2 (zwei) Dateien in die Exe packen möchte, ich habe es so probiert:
Delphi-Quellcode:
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;
Das klappt glaube ich soweit.

Jetzt möchte ich es aber Splitten, das habe ich so versucht:
Delphi-Quellcode:
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;
Das klappt leider nicht, denn die DLL die ich "verpacke" hat am Ende 0 Byte und ist laut Windows "keine DLL-Datei" mehr.

Was mache ich falsch?

Tommy1988 27. Jul 2007 14:25

Re: Joinen und Splitten von Dateien
 
Kennt keiner eine Antwort?

marabu 27. Jul 2007 17:28

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

Tommy1988 27. Jul 2007 18:34

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?

marabu 27. Jul 2007 18:54

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

DeddyH 27. Jul 2007 19:04

Re: Joinen und Splitten von Dateien
 
Zitat:

Zitat von marabu
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.

AFAIK machen das die meisten SFX-Module genauso. :zwinker:

Tommy1988 27. Jul 2007 19:23

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:
ExePfad := ExtractFilePath(Application.ExeName);

Join(ExePfad+'HauptECHSE.exe',
ExePfad+'ZusatzECHSE.exe');
HauptECHSE soll ZusatzECHSE "joinen" doch Stream-Schreibfehler.


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