Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi ReadFile liest nicht die ganze Datei (https://www.delphipraxis.net/77185-readfile-liest-nicht-die-ganze-datei.html)

Cmd.exe 15. Sep 2006 19:17


ReadFile liest nicht die ganze Datei
 
Hi Leute,
mein Problem hab ich im source code beschrieben. Hoffe ihr könnt mir helfen :wink:

Delphi-Quellcode:
//Beispielcode
//APIs.GetFileSize nutzt in dem Fall FindFirstFile um Größe der Datei zu erhalten (funktioniert)
var Buffer: pchar;
    i64: int64;
    hHandle: integer;
    lpNumberOfBytesRead: cardinal;
begin
  i64 := APIs.GetFileSize(ExtractFilePath(ParamStr(0)) + 'Skin.cont');
  hHandle := // FileHandle
             CreateFile(pChar(ExtractFilePath(ParamStr(0)) + 'Skin.cont'), GENERIC_READ, FILE_SHARE_READ, Nil, OPEN_EXISTING, 0, 0);
  SetFilePointer // Pointer um von Anfang an zu lesen
                 (hHandle, 0, 0, FILE_BEGIN);
  GetMem(Buffer, i64);
  ReadFile(hHandle, Buffer^, i64, lpNumberOfBytesRead, NIL);
  FreeMem(Buffer, i64); //Breakpoint
end;
//Problem: lpNumberOfBytesRead sagt mir, dass es die volle Byte Zahl gelesen hat,
//         jedoch ist nur ein geringer Teil (Anfang der Datei) im Buffer, wenn ich am Breakpoint mir den Buffer anzeigen lasse.
Vielen dank schonmal im voraus.

mkinzler 15. Sep 2006 19:48

Re: ReadFile liest nicht die ganze Datei
 
Bist du die sicher, daß nicht nur ein Teil angezeigt wird?

Cmd.exe 15. Sep 2006 20:31

Re: ReadFile liest nicht die ganze Datei
 
Ich bin mir insofern sicher, dass nicht nur ein teil angezeigt wird, weil Length(Buffer) auch nur die anzahl an zeichen ergibt, die mir delphi anzeigt.

mkinzler 15. Sep 2006 20:35

Re: ReadFile liest nicht die ganze Datei
 
Schreibe mal die volel Anzahl bytes in einen andere datei und vergleiche sie mit der ursprünlichen.

Muetze1 15. Sep 2006 20:48

Re: ReadFile liest nicht die ganze Datei
 
PChar => er beachtet das Nullbyte. Daher wird der hint an einem solchen abgeschnitten, somit zeigt er dir zu wenig an. Length() wiederrum wird den PChar als String übergeben bekommen und diese Konvertierung beachtet genauso das Nullbyte. Entweder benutzt du einen allgemeineren Datenzeiger-Typ oder du schaust dir den Inhalt mit Routinen an, welche sich auf die wahre Länge verlassen. Wenn ReadFile() sagt er habe soviel gelesen, dann hat er es auch.

Ansonsten: afaik ist die Dateiposition nach dem Öffnen immer bei Offset 0.


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