Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Datei in array of Byte öffnen und Speichern (https://www.delphipraxis.net/24376-datei-array-byte-oeffnen-und-speichern.html)

bixi400 20. Jun 2004 10:06


Datei in array of Byte öffnen und Speichern
 
hi!

Wie kann ich eine Datei in einem "array of Byte" öffnen
und nach dem Bearbeiten wieder Speichern?

MrKnogge 20. Jun 2004 10:38

Re: Datei in array of Byte öffnen und Speichern
 
Ich würde sie mit einem TFileStream in das array einlesen.

ungetestet:

Delphi-Quellcode:
...

var
  Form1: TForm1;
  MyDat: array of Byte;

...

// einlesen
procedure TForm1.btnlesenClick(Sender: TObject);
var
  fs: TFileStream;
  i: integer;
begin
  fs := TFileStream.Create('C:\test.dat', fmOpenRead);
  SetLength(MyDat, fs.Size);
  for i := 0 to fs.Size-1 do
    fs.Read(MyDat[i], SizeOf(byte));
  fs.free;
end;


// speichern
procedure TForm1.btnlesenClick(Sender: TObject);
var
  fs: TFileStream;
  i: integer;
begin
  fs := TFileStream.Create('C:\test.dat', fmCreate);
  for i := 0 to High(MyDat) do
    fs.Write(MyDat[i], SizeOf(byte));
  fs.free;
end;
[edit]fs.free vergessen[/edit]

bixi400 20. Jun 2004 10:44

Re: Datei in array of Byte öffnen und Speichern
 
Danke Funktioniert!!! :hello: :hello: :spin2: :spin2:

Jens Schumann 20. Jun 2004 11:41

Re: Datei in array of Byte öffnen und Speichern
 
Achtung: Es funktioniert aber nur mit kleinen Dateien
Wenn Du eine z.B. 100 MB Datei öffnest wird die komplett in der Arbeitsspeicher geladen.
Wenn es darum geht auf die einzelnen Bytes zuzugreifen ist 1. ziemlich langsam und 2. Arbeitsspeicherverschwenderei erster Extraklasse. Das Array wird dann ebenfalls 100 MB groß sein.

Wenn Du auf die einzelnen Bytes zugreifen möchtest bis Du mit Seek besser bedient.
Verwende lieber folgende Methoden

Delphi-Quellcode:
function ReadByteFromStream(aStream: TStream; aIndex: Int64): Byte;
begin
  aStream.Seek(aIndex,soFromBeginning);
  aStream.Read(Result,SizeOf(Byte));
end;

procedure WriteByteToStream(aStream: TStream; aIndex: Int64; aByte : Byte);
begin
  aStream.Seek(aIndex,soFromBeginning);
  aStream.Write(aByte,SizeOf(Byte));
end;
aIndex entspricht dann dem ArrayIndex.


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:02 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz