Potrzebuję czegoś takiego:
Mam swój program napisany w delphi, skompilowany do exe .Mam też jakieś dane w pliku txt. Potrzebuję dołączyć do tego execa (za pomocą innego mojego programu) plik txt, a następnie móc odczyctać te dane. Komp[letnie nie mam pomysłu, jak to zrobić. Z góry dziękuję za pomoc.
Nie mozesz w fazie projektowania wrzucic zawartosci do memo a potem normalnie to odczytywac, to najprostszy sposob dodawania zasobow :)
// w takim razie masz to w FAQ. mozesz zapisac to jako komentarze do programu, inaczej sie raczej nie da
Nie, chyba źle mnie zrozumiałeś. Oto co mam:
- Plik "Program1.exe"
- Plik "Połącz.exe"
- Plik "Dane.txt"
Odpalam program "Połącz.exe" i w rezultacie do pliku "Program1.exe" dopisują się na końcu informacje z "Dane.txt". Dopisują się w taki sposób, żebym mógł to potem z Program1.exe odczytać.
No to musisz poznać budowę pliku exe, albo na końcu dorzucić jeszcze rozmiar odczytywanych danych.
Tradycyjny przykład użycia zasobów. Poczytaj w FAQu, chyba pod hasłem "jak dodać jakiś plik do mojego programu" albo cos takiego. W kodzie programu wyciagniecie pliku to pare linijek, a zasoby mozesz dodac tworzac drugi plik .res (restoratorem lub Borland resource compiler), albo dodajac zasoby do gotowego exe popularnym programem ResourceHacker :).
yyy, chyba mnei wylogowalo :P Kto zjadl mi ciasteczka?! :P
Najpierw zajrzyj tutaj a dopiero potem otworz linka ponizej :P
http://swwweet.w.interia.pl/bart.jpg
tysiące razy bylo poruszane na forum !
Zapis:
najłatwiej jest dopisać do pliku na jego końcu potrzebmna dane a jako ostatnie 4 bajty dodać długość ciągu (wielkość pliku).
Odzczyt:
czytasz ost 4 bajty i odejmujesz wartość zapisaną w nich plus 4 od wielkości pliku exe a następnie skaczesz do tego miejsca i czytasz do miejsca końca pliku minus 4 bajty
Cytuje:
"
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.LoadClick(Sender: TObject);
var
aStream: TMemoryStream;
begin
if opendialog1.Execute
then
begin
aStream := TMemoryStream.Create;
LoadFromFile(opendialog1.FileName, aStream);
Memo1.Lines.LoadFromStream(aStream);
aStream.Free;
end;
end;
{
Note:
You can't proof whether additional data is attached or not.
To reach this, you would have to create a checksumm of the
MemoryStream and attach it.
Hinweis:
Es kann nicht überprüft werden ob zusätzliche Daten in der Datei
vorhanden sind. Um das zu erreichen müsste man eine Checksumme des MemoryStreams
erzeugen und ebenfalls anhängen.
}
procedure TForm1.SaveClick(Sender: TObject);
var
aStream: TMemoryStream;
begin
if savedialog1.Execute then
begin
aStream := TMemoryStream.Create;
Memo1.Lines.SaveToStream(aStream);
AttachToFile(savedialog1.FileName, aStream);
aStream.Free;
end;
end;
end.
"
....