Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi TFileStream, Buffer, kA einlesen / auslesen (https://www.delphipraxis.net/135774-tfilestream-buffer-ka-einlesen-auslesen.html)

Morbid 17. Jun 2009 18:45


TFileStream, Buffer, kA einlesen / auslesen
 
Hi,

Ich bin jetzt seit einigen Stunden am suchen, allerdings hab ich leider noch nichts brauchbares gefunden, hoffe wer von euch kann mir weiterhelfen. (Auch nach 4 Jahren Delphi in der Schule haben wir sowas nicht gesehen...)

Also das Problem ist dass ich kA hab wie ich eine Datei (keine .txt-Datei, sondern eine .exe, .doc oder was auch immer) in einen Buffer schreibe.

Säter will ich diese Datei auch wieder herstellen.

Zu Testzwecken wollte ich also probieren eine Datei damit zu Copieren. Allerdings funktionierts nicht.

Global:
Delphi-Quellcode:
var gFileSize: integer;
Einlesen:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  i: Integer;
  DateiFS: TFileStream;
begin
  DateiFS := TFileStream.Create('C:\Delphi_Test.exe', fmOpenRead);
  gFileSize := DateiFS.Size

  try
    for i := 1 to gFileSize do
      begin
        //kA was hierhin kommt und ob das andere richtig ist?
      end;
  finally
    DateiFS.Free;
  end;
end;
Auslesen:
Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
var i: integer;
    DateiFS: TFileStream;
begin
  DateiFS := TFileStream.Create('C:\Delphi_Test_Blup.exe', fmCreate);
  try
    for i := 1 to gFileSize do
      begin
        //kA was hierhin kommt und ob das andere richtig ist?
      end;
  finally
    DateiFS.Free;
  end;
end;
mfG Morbid

jfheins 17. Jun 2009 18:48

Re: TFileStream, Buffer, kA einlesen / auslesen
 
Wenn mich nicht alles täuscht, hat der Stream eine Methode Write-/ReadBuffer - die erwartet eine Adrssse und eine Länge und schreibt dann an die Adresse die Daten.

D.h. Du machst bspw. ein Array of Byte, setzt die Länge auf die des Filestreams und benutzt fs.readbuffer(@array[0], fs.length) oder so ähnlich ;)

Danach ist der Dateiinhalt im Array.

Morbid 17. Jun 2009 18:52

Re: TFileStream, Buffer, kA einlesen / auslesen
 
Ok, danke! ;)

Aber gibts da ne Möglichkeit kein Array zu verwenden, sondern ein String?
Oder was würdest du mir empfehlen wenn ich es übers Netzwerk übertragen will, kA obs mit nem array auch so einfach geht? ;)

mfG Cedric

Aphton 17. Jun 2009 19:00

Re: TFileStream, Buffer, kA einlesen / auslesen
 
Klar, lies einfach per ReadBuffer den Inhalt vom Stream in eine String-Variable ein.
Zuerst solltest du natürlich die Länge des Strings per SetLength setzen und anschließend
beim Lesen den 1 Index angeben - so mein ich das: DateiFS.ReadBuffer( StringVariable[1], <Länge_des_String> )

Morbid 17. Jun 2009 19:24

Re: TFileStream, Buffer, kA einlesen / auslesen
 
Ok, danke, hat super geklappt :)

Hab allerdings noch ne kleine Frage, will ich diese Datei jetzt Einlesen, über Socket senden, muss ich ja als erstes die gFileSize und den Sring (gUebergabe) übertragen.
Dann wieder Auslesen? Müsste ja auch so mit dem SendText des Sockets funktionieren, verstehe den SendBuf oder SendStream nämlich nicht ganz...

Global:
Delphi-Quellcode:
var gUebergabe: string;
    gFileSize: integer;
Einlesen:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  I: Integer;
  DateiFS: TFileStream;
begin
  DateiFS := TFileStream.Create('C:\Delphi_Test.doc', fmOpenRead);
  gFileSize := DateiFS.Size;
  SetLength(gUebergabe,gFileSize);
  try
    DateiFS.ReadBuffer(gUebergabe[1], gFileSize);
  finally
    DateiFS.Free;
  end;
end;
Auslesen:
Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
var I: integer;
    DateiFS: TFileStream;
begin
  DateiFS := TFileStream.Create('C:\Delphi_Test_Blup.doc', fmCreate);
  try
    DateiFS.WriteBuffer(gUebergabe[1], gFileSize);
  finally
    DateiFS.Free;
  end;
end;

Aphton 17. Jun 2009 19:28

Re: TFileStream, Buffer, kA einlesen / auslesen
 
Neue Frage = neuer Thread

Aber ein kleiner Tipp:
Du solltest dir einen kleinen Header definieren, in der wichtigste Daten stehen, und die Daten (nicht Headerdaten) solltest du nur sequenziell in kleinen Paketen schicken (Meine Ansicht)

MfG

Morbid 17. Jun 2009 19:42

Re: TFileStream, Buffer, kA einlesen / auslesen
 
OK ;)

Ja danke ;)
Hab mir schon vor einiger Zeit ein kleines Protokoll geschrieben dass die zu übertragen Daten in Blöcke aufteilt, einen Prefix anhängt und es sendet, ausserdem hab ich meinem letzten Block einen Suffix angehängt.
Auf der anderen Seite werden Prefix und Suffix entfernt und neu zsgesetzt.
Mal versuchen ob es bei diesem String (gUebergabe) auch funktioniert. ;)

--> Aja, noch was zu diesem Thema, ist es normal well ich diesen String (gUebergabe) in ein Memo schreibe, es nur 5 Zeichen sind obwohl es eine .avi ist mit über 200MB? oder wo liegt das Problem bei:
Delphi-Quellcode:
Memo1.Text := gUebergabe;
mfGCedric

Klaus01 17. Jun 2009 19:56

Re: TFileStream, Buffer, kA einlesen / auslesen
 
Zitat:

Zitat von Morbid

--> Aja, noch was zu diesem Thema, ist es normal well ich diesen String (gUebergabe) in ein Memo schreibe, es nur 5 Zeichen sind obwohl es eine .avi ist mit über 200MB? oder wo liegt das Problem bei:
Delphi-Quellcode:
Memo1.Text := gUebergabe;
mfGCedric

N'abend Cedric,

in einem Memo werden Texte angezeigt, also nur ein gewisser Teil
aller Binärzeichen.
-und die Musik und Filme sind in einer avi Datei sicherlich nicht als Text gespeichert.

Grüße
Klaus

Morbid 17. Jun 2009 22:15

Re: TFileStream, Buffer, kA einlesen / auslesen
 
Ach so, danke ;)
Ja verstehe, gibts denn was Memo-ehnliches mit dem man es anzeigen kann (Unter Delphi 5)?

Wo kommt bei meinem BSP. eigentlich
Delphi-Quellcode:
Application.ProcessMessages
hin damit nicht alles hängt beim laden oder was muss man da sonst machen? ;)

mfg Cedric


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:51 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