Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Problem mit FileRead (https://www.delphipraxis.net/23043-problem-mit-fileread.html)

_Ben_ 27. Mai 2004 23:51


Problem mit FileRead
 
Hi,

ich hab hier ein ganz banales Problem. Ich schaff's nicht Daten aus ner Datei einzulesen...

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  iReturn: Integer;
  iFileHandle: Integer;
  TagVersion: array[0..2] of byte;
begin
  iFileHandle := FileOpen('C:\test.mp3', fmOpenRead or fmShareDenyNone);
    Application.MessageBox(PAnsiChar(IntToStr(iFileHandle)), 'Rückgabe FileOpen:');

    iReturn := FileSeek(iFileHandle, 0, 2);
    Application.MessageBox(PAnsiChar(IntToStr(iReturn)), 'Rückgabe FileSeek:');

    iReturn := FileRead(iFileHandle, TagVersion, SizeOf(TagVersion));
    Application.MessageBox(PAnsiChar(IntToStr(iReturn)), 'Rückgabe FileRead:');

  FileClose(iFileHandle);
end;
Das Problem ist, dass FileRead nichts macht...
Wenn ich das richtig verstanden habe sollte die Funktion die Anzahl der eingelesenen Bytes zurück geben. Die ist aber immer 0!
Kann mir einer sagen was ich falsch mach?

MfG, Ben

SirThornberry 28. Mai 2004 00:08

Re: Problem mit FileRead
 
Wenn 0 zurück gegeben wird hat es geklappt. Die Hilfe sagt
Zitat:

The function result is the actual number of bytes read, which may be less than Count.
Was soviel heißt dass, das result der function die differenz zwischen zu lesenden bytes und gelesenen bytes zurück gibt.

Luckie 28. Mai 2004 00:21

Re: Problem mit FileRead
 
Zitat:

Zitat von SirThornberry
Wenn 0 zurück gegeben wird hat es geklappt. Die Hilfe sagt
Zitat:

The function result is the actual number of bytes read, which may be less than Count.
Was soviel heißt dass, das result der function die differenz zwischen zu lesenden bytes und gelesenen bytes zurück gibt.

Das sehe ich nicht so:
Zitat:

Das Rückgabewert der Funktion ist die tatsächlich gelesene Anzahl an Bytes, welche auch kleiner sein kann. als die Anzahl, die gelesen werden soll.
Wird also 0 zurückgegeben, dann wurde gar nichts gelesen wie _Ben_ schon richtig erkannt hat. Ich arbeite gerade an dem Problem.

So, habe jetzt was:
Delphi-Quellcode:
function GetTagVersion(Filename: String; var TagInfo: TtagInfo): DWORD;
var
  hFile: THandle;
  dummy: TTagInfo;
begin
  SetLastError(0);
  hFile := FileOpen(Filename, fmOpenRead or fmShareDenyNone);
  if hFile <> 0 then
  begin
    // Muss Offset nicht drei sein?
    // Du willst doch die letzten drei Byte auslesen, also musst du
    // vom Dateiende drei Bytes zurückgehen und ab da lesen.
    // (Ist nur so eine Vermutung, korrigier mich, wenn ich falsch
    // liegen sollte.)
    if FileSeek(hFile, 3, 2) <> -1 then
    begin
      FileRead(hFile, dummy, sizeof(TTagInfo));
    end;
    FileClose(hFile);
  end;
  TagInfo := dummy;
  Result := GetLastError();
end;

function TagInfoToHexStr(TagInfo: TTagInfo): String;
var
  s: String;
  i: Integer;
begin
  for i := 0 to 2 do
  begin
    s := s + IntToHex(TagInfo[i], 4)+ ' ';
  end;
  result := s;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  TagInfo: TTagInfo;
  dwReturn: DWORD;
begin
  dwReturn := GetTagVersion('G:\MP3s\Beatles\Beatles -  Blue Jay Way.mp3', TagInfo);
  if dwReturn = 0 then
  begin
    ShowMessage(TagInfoToStr(TagInfo));
  end
  else
    ShowMessage(SysErrorMessage(dwReturn));
end;
Bei dieser Datei sind die letzten drei Bytes: $0000 $006E $0000.

_Ben_ 28. Mai 2004 13:46

Re: Problem mit FileRead
 
Hi,

Ja, beim FileSeek hab ich natürlich blödsinn geschrieben. Das kann so ja nicht gehen. Ich will erst mal einlesen um was für ne ID3-Version es sich handelt. Wenn es sich um V1.0 handelt sollte an Offset -128 vom Dateiende 'TAG' stehen. Dann 30 Byte für Titel, 30 Byte für Interpret etc.
Hab ich geändert. Ist aber eigentlich mal nebensächlich. Ich wär schon froh wenn ich mit FileRead überhaupt irgendwas einlesen könnte...

Ich hab jetzt mal den Datentyp des FileHandles auf THandle geändert wie du's vorgemacht hast. Bringt leider nichts aber ist vielleicht sauberer.
Liegt's vielleicht an meinem Byte-Array dass FielRead da nichts reinschreibt? Überegeb ich das nicht richtig? (Stichwort: By Value/ Reference)
Aber selbst wenn FileRead mit ner Kopie arbeiten würde und ich desswegen in meinem Array keine veränderung feststellen könnte sollte doch die Funktion zurückgeben dass sie x Byte gelesen hat!
Was für ein Datentyp steckt denn bei dir hinter TTagInfo?

MfG, Ben

_Ben_ 28. Mai 2004 14:09

Re: Problem mit FileRead
 
Hallo nochmal!

Hab's jetzt! Wie ich grad geschrieben hab: der Offset den ich brauch liegt 128 Bytes VOR dem Dateiende...
Also:
Delphi-Quellcode:
FileSeek(hFile, -128, 2);
Ich hab die ganze Zeit 128 geschrieben und bin somit im Nirvana gelandet! :wall:

Jetzt würde mich bloß noch interessieren warum bei mir FileRead in dem Fall gar nichts liest, Luckie aber ein Ergebniss bekommt...

Naja, wenigstens hauts jetzt hin...

Ciao, Ben

Luckie 28. Mai 2004 14:21

Re: Problem mit FileRead
 
Zitat:

Zitat von _Ben_
Was für ein Datentyp steckt denn bei dir hinter TTagInfo?

Ups, habe ich vergessen:
Delphi-Quellcode:
type
  TTagInfo = array [0..2] of Byte;
Zitat:

Ich hab die ganze Zeit 128 geschrieben und bin somit im Nirvana gelandet!
Mach dir nichts draus, wie du siehst habe ich den gleichen Fehler gemacht. ;)

SirThornberry 28. Mai 2004 14:40

Re: Problem mit FileRead
 
Oh, vielleicht sollte ich nächstes mal die hilfe genauer lesen und nicht falsch übersetzen :oops:


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