Entwickler-Ecke

Dateizugriff - FileSeek und FileRead...Fehler?!


Blacked - Do 22.08.02 08:50
Titel: FileSeek und FileRead...Fehler?!

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
procedure TForm1.BitBtn1Click(Sender: TObject);
var
  iFileHAndle: Integer;
  Buffer: PChar;
begin
  Buffer := PChar(AllocMem(129));
  iFileHandle := FileOpen('D:\Musik\JCA\JCA - i begin to wonder.mp3', fmopenread);
  FileSeek(iFileHandle,-128,2);
  FileRead(iFileHandle, Buffer, 128);
  FileClose(iFileHandle);
  FreeMem(Buffer);
end;

Ich bekomme hierbei eine EAccessViolation - kann mir einer sagen was ich hier falsch mache... ich möchte eigentlich nur die letzten 128Byte aus einer Datei auslesen :-\
Bin für jede Hilfe Dankbar!

Ciao Blacked


Tino - Do 22.08.02 09:23

An welcher Stelle tritt die Fehlermeldung denn auf?

Versuch mal folgendes:

Quelltext
1:
FileSeek(iFileHandle, 128, 2);                    

Also nicht -128 sondern 128!

Gruß
TINO


Blacked - Do 22.08.02 09:33

Das habe ich schon versucht... also laut meinen Tests tritt der fehler beim FileRead auf...?!?


Delta7 - Fr 23.08.02 02:13

Hallo,

versuch mal

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
  var Buffer:pointer;
begin
...
Buffer:=AllocMem(128);
...
freeMem(buffer,128);
end;

//oder , der Einfachheit halber

var Buffer:array[0..127] of byte;  //oder Char wenns beliebt
      pBuffer:pointer;

...
pBuffer:=@Buffer;
FileRead(iFileHandle,pBuffer,sizeOf(buffer));
....


Gruss
Thomas


Blacked - Mo 26.08.02 09:08

Soweit funktioniert es, allerdings schmiert es mir jetzt ab wenn ich den Buffer ausgeben will auf ein Edit!
Irgend eine Idee? Muss ich vielleicht irgendwas beachten bei der ausgabe des Buffer?!

mfg Blacked :roll:


SMI - Mo 26.08.02 11:39

Hast du den Speicher vieleicht zu früh freigegeben? Erst die Daten dem Editfeld zuweisen, dann den Speicher freigeben. Ich hab unten ein Beispiel gemacht, jedoch habe ich die API Befehle für den Dateizuriff verwendet.


SMI


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
var
  iFileHAndle: Integer;
  lpBuffer: PCHAR;

  null:integer;
begin
  lpBuffer := AllocMem(129);
  iFileHandle:=CreateFile('\\.\d:\TEST.txt',GENERIC_READ,0,nil,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
  SetFilePointer(iFileHandle,-129,NIL,FILE_END);
  ReadFile(iFileHAndle, lpBuffer^, 129, NULL, nil);
  CloseHandle(iFileHandle);
  ShowMessage(STRING(lpBuffer)+#0);
  edit1.text:=STRING(lpBuffer)+#0;
  FreeMem(lpBuffer);
end;