Einzelnen Beitrag anzeigen

Eagelone

Registriert seit: 31. Aug 2003
Ort: Augsburg
15 Beiträge
 
#1

Dateien an eine exe Datei mit dranhängen

  Alt 27. Dez 2003, 13:01
Hallo liebe Community!

Ich habe folgendes Problem:
Ich habe mir ein Programm geschrieben, was aus 2 Teilen besteht: Dem Wizard zum Erstellen von 2 Konfigurationsdateien und dem Hauptprogramm was Informationen aus den beiden Konfigurationsadateien ausliest.

Jetzt möchte ich es so machen, dass der Wizard die 2 erstellten Konfiguartionsdateien mit an die exe-Datei des Hauptprogrammes anhängt bzw. einbindet.
Weil im Moment muss ich immer alle 3 Dateien weitergeben:
Die 2 Konfigurationsdateien und das Hauptprogramm. Und das soll dann jetzt alles nur noch eine Datei sein!

Das habe ich jetzt so realisiert:
Delphi-Quellcode:
function AttachToFile(const AFileName: string; MemoryStream: TMemoryStream): Boolean;
var
  aStream: TFileStream;
  iSize: Integer;
begin
  Result := False;
  if not FileExists(AFileName) then
    Exit;
  try
    aStream := TFileStream.Create(AFileName, fmOpenWrite or fmShareDenyWrite);
    MemoryStream.Seek(0, soFromBeginning);
    // seek to end of File
    // ans Ende der Datei Seeken
    aStream.Seek(0, soFromEnd);
    // copy data from MemoryStream
    // Daten vom MemoryStream kopieren
    aStream.CopyFrom(MemoryStream, 0);
    // save Stream-Size
    // die Streamgröße speichern
    iSize := MemoryStream.Size + SizeOf(Integer);
    aStream.Write(iSize, SizeOf(iSize));
  finally
    aStream.Free;
  end;
  Result := True;
end;

function LoadFromFile(const AFileName: string; MemoryStream: TMemoryStream): Boolean;
var
  aStream: TFileStream;
  iSize: Integer;
begin
  Result := False;
  if not FileExists(AFileName) then
    Exit;

  try
    aStream := TFileStream.Create(AFileName, fmOpenRead or fmShareDenyWrite);
    // seek to position where Stream-Size is saved
    // zur Position seeken wo Streamgröße gespeichert
    aStream.Seek(-SizeOf(Integer), soFromEnd);
    aStream.Read(iSize, SizeOf(iSize));
    if iSize > aStream.Size then
    begin
      aStream.Free;
      Exit;
    end;
    // seek to position where data is saved
    // zur Position seeken an der die Daten abgelegt sind
    aStream.Seek(-iSize, soFromEnd);
    MemoryStream.SetSize(iSize - SizeOf(Integer));
    MemoryStream.CopyFrom(aStream, iSize - SizeOf(iSize));
    MemoryStream.Seek(0, soFromBeginning);
  finally
    aStream.Free;
  end;
  Result := True;
end;

procedure TForm1.SaveClick(Sender: TObject);
var
  aStream: TMemoryStream;
begin
  aStream := TMemoryStream.Create;
  Memo1.Lines.SaveToStream(aStream);
  AttachToFile('Test.exe', aStream);
  aStream.Free;
end;

procedure TForm1.LoadClick(Sender: TObject);
var
  aStream: TMemoryStream;
begin
  aStream := TMemoryStream.Create;
  LoadFromFile('Test.exe', aStream);
  Memo1.Lines.LoadFromStream(aStream);
  aStream.Free;
end;
Habe das von SwissDelphiCenter.
Ist das eine vernünfitige Lösung oder gibt es noch eine bessere?


Wenn das die Beste ist, dann folgende Fragen:
Die eine Datei von meinen beiden Konfigurationsdateien ist im Ini-Format. Da ist das Einlesen kein Problem, aber die andere Datei wird bei mir wie folgt erstellt:
Delphi-Quellcode:
 
type
  TProdukt = record
    Nummer: integer;
    Beschreibung: string[200];
    Preis: real;
  end;


   begin
      AssignFile(datei, 'test.abc'); // Dateizuweisung
      Rewrite(datei); // Erstellt die Datei
      for i := 0 to Produkte.Items.Count - 1 do // Durchläuft alle Zeilen wobei Produkte eine TListView-Komponente ist
        with Produkte.Items.Item[i] do
        begin
          datensatz.Nummer := StrToInt(Caption); // Spalte 1
          datensatz.Beschreibung := SubItems.Strings[0]; // Spalte 2
          datensatz.Preis := StrToFloat(SubItems.Strings[1]); // Spalte 3
          write(datei, datensatz); // Schreibt die Datei
        end;
      CloseFile(datei);
    end;
Und jetzt ist das Problem, wie ich die wieder einlese.
Bis her habe ich das so gemacht:

Delphi-Quellcode:
    AssignFile(datei, 'test.abc');
    Reset(datei);
    i := 0;
    while (not EOF(datei)) do
    begin
      SetLength(produkte, i + 1);
      read(datei, produkte[i]);
      cbProdukt1.Items.Add(produkte[i].Beschreibung); // cbProdukte ist jeweils eine Combobox
      cbProdukt2.Items.Add(produkte[i].Beschreibung);
      cbProdukt3.Items.Add(produkte[i].Beschreibung);
      cbProdukt4.Items.Add(produkte[i].Beschreibung);
      cbProdukt5.Items.Add(produkte[i].Beschreibung);
      inc(i);
    end;
    CloseFile(datei);
Wie kann ich nun das gleiche damit erreichen, aber so, dass die beiden Dateien trotzdem an die exe-File mit rangehängt werden?

Wie sicher sind die Daten, die ich an die exe-Datei mitranhänge?
Sollte ich die noch verschlüsseln mit RSA oder so bzw. lohnt es sich?

Kann die eigtl. exe-Datei irgendwie Schaden nehmen oder kann es da zu unerwarteten Fehlern kommen?

Hoffe, dass ihr mir helfen könnt!

Danke im Voraus!


Eagelone
  Mit Zitat antworten Zitat