Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Datei auslesen mit FileStream (https://www.delphipraxis.net/38647-datei-auslesen-mit-filestream.html)

Die Muhkuh 22. Jan 2005 10:08


Datei auslesen mit FileStream
 
Hi,

meine Leitung is mal wieder zu lange...

Ich hab schon im Forum gesucht, auch Sachen gefunden, aber auf den grünen Zweig bin ich noch nicht gekommen.

Also, ich möchte eine Datei mit einem FileStream auslesen (ich denke das ist schneller, als alles in eine StringList zu schreiben und dann auslesen) und dann in ein RichEdit schreiben. Hier mal meine Procedure:

Delphi-Quellcode:
var
  FS: TFileStream;
  I: Integer;
  Buffer: String;
begin
  if dOpen.Execute then
  begin
    if dOpen.Files.Count > 0 then
    begin
      for I := 0 to dOpen.Files.Count - 1 do
      begin
        FS := TFileStream.Create(dOpen.Files[I], fmOpenRead + fmShareDenyRead); //<-- Hier ist eine AV
        try
          FS.ReadBuffer(Buffer, SizeOf(Buffer));

          case GetDoc.FEditor of
            etRichText: GetDoc.RichEdit.SelText := Buffer;
            etCode: GetDoc.Code.SelText := Buffer;
          end;
        finally
          FS.Free;
        end;
      end;
    end
    else
    begin
      FS := TFileStream.Create(dOpen.FileName, fmOpenRead + fmShareDenyRead); //<-- Hier ist eine AV
      try
        FS.ReadBuffer(Buffer, SizeOf(Buffer));

        case GetDoc.FEditor of
          etRichText: GetDoc.RichEdit.SelText := Buffer;
          etCode: GetDoc.Code.SelText := Buffer;
        end;
      finally
        FS.Free;
      end;
    end;
  end;
end;
Ich bekomm aber eine Zugriffverletzung, obwohl die Datei 100% nicht in Benutzung ist.
Ich denke ist so ein einfacher Fehler das ich ihn mal wieder nich finde :cry:

Luckie 22. Jan 2005 10:22

Re: Datei auslesen mit FileStream
 
Was mir als erstes auffällt: verknüpf mal die Föags mit or.

Und dann: sizeof(Buffer) dürfte dir immer vier Bytes liefern, da ein String auch nur ein Zeiger ist. So sollte es gehen:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  fs: TFileStream;
  Buffer: String;
  len: Cardinal;
begin
  fs := TfileStream.Create('d:\Dokumente\Filme.txt', fmOpenRead);
  try
    len := fs.Size;
    SetLength(Buffer, len);
    try
      fs.ReadBuffer(Buffer[1], len);
      Memo1.Text := Buffer;
    except
      on E: EReadError do ShowMessage(E.Message);
    end;
  finally
    FreeAndNil(fs);
  end;
end;

Die Muhkuh 22. Jan 2005 10:41

Re: Datei auslesen mit FileStream
 
Hi Luckie,

thx :thumb: Klappt super^^.

Luckie 22. Jan 2005 10:42

Re: Datei auslesen mit FileStream
 
Mit der Angabe sizeof(Buffer) bekommst du übrigens keine AV, sondern eben nur die ersten vier Zeichen eingelesen. Dein Fehler muss wo anders gesteckt haben.

SirThornberry 22. Jan 2005 10:47

Re: Datei auslesen mit FileStream
 
der fehler lag in der zeile
Delphi-Quellcode:
FS.ReadBuffer(Buffer, SizeOf(Buffer));
er hat wie schon erwähnt mit sizeof anstelle von length gearbeitet und bei buffer "[1]" vergessen

Luckie 22. Jan 2005 10:48

Re: Datei auslesen mit FileStream
 
Habe ich gar nicht gesehen. :? So was ist mir schon so in Fleisch und Blut übergegangen, dass ich bei so was gar nicht mehr nachdenken muss. :roll:


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