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 Mit SetFilePointer zum Ende - n springen, wie? (https://www.delphipraxis.net/115224-mit-setfilepointer-zum-ende-n-springen-wie.html)

sk0r 8. Jun 2008 15:16


Mit SetFilePointer zum Ende - n springen, wie?
 
Hi,

joa, das Topic sagt eigentlich schon alles...
Wie mache ich das? n kann eine beliebige Nummer sein.

MfG: sk0r

Zacherl 8. Jun 2008 15:17

Re: Mit SetFilePointer zum Ende - n springen, wie?
 
GetFileSize gibt dir die Gesamtgröße der Datei. N musst du dann nur noch abziehen.

Apollonius 8. Jun 2008 15:21

Re: Mit SetFilePointer zum Ende - n springen, wie?
 
Es gibt nicht umsonst den Wert FILE_END für dwMoveMethod.

Zacherl 8. Jun 2008 15:29

Re: Mit SetFilePointer zum Ende - n springen, wie?
 
Ja klar, aber dann springt er doch komplett ans Dateiende. Oder wird der Offset dann von hinten aus zurückgesprungen?

sk0r 8. Jun 2008 15:43

Re: Mit SetFilePointer zum Ende - n springen, wie?
 
Ich kann doch nicht einfach FILE_END - n machen.^^

Luckie 8. Jun 2008 15:52

Re: Mit SetFilePointer zum Ende - n springen, wie?
 
Ist es denn eigentlich so schwer die Hilfe zu lesen? MSDN-Library durchsuchenSetFilePointer Allerdings wäre es wohl zu empfehlen MSDN-Library durchsuchenSetFilePointerEx zu nutzen.

sk0r 8. Jun 2008 16:08

Re: Mit SetFilePointer zum Ende - n springen, wie?
 
Sorry, aber ich kann kein Englisch. :(

Delphi-Quellcode:
type TByteArr = array[0..1] of Byte;

function GetValue:TByteArr;
var
  hOpn: Cardinal;
  OfStruct: TOFStruct;
  dwBytesRead: Cardinal;
  mBuf: TByteArr;
begin
  hOpn := OpenFile(PChar(GetMySelf()), OfStruct, 0);
  if hOpn <> 0 then
  begin
    SetFilePointerEx(hOpn, -2, nil, FILE_END);
    ReadFile(hOpn, mBuf, 2, dwBytesRead, nil);
    showmessage(inttostr(mBuf[0]) + inttostr(mBuf[1]));
    result := mBuf;
    CloseHandle(hOpn);
  end;
end;
So versuche ich nun die Zahl auszulesen. Ich habe am Ende der Datei eine 17 platziert,
aber es kommt immer eine andere Zahl (690) heraus.

himitsu 8. Jun 2008 17:01

Re: Mit SetFilePointer zum Ende - n springen, wie?
 
erstens ist mein Englich auch nicht sonderlich gut, aber dennoch kann/versuch ich es zu lesen ... notfalls gibt's ja noch Wörterbücher und Übersetzer :stupid:


Zitat:

Ich habe am Ende der Datei eine 17 platziert,
und wie hast du das gemacht?


zu OpenFile:
Zitat:

Only use this function with 16-bit versions of Windows. For newer applications, use the CreateFile function.
zu Deutsch: verwende MSDN-Library durchsuchenCreateFile, da OpenFile eine veraltete Funktion ist (Windows 3.1 und Co.)



PS: dieses geht bei mir:
Delphi-Quellcode:
type TByteArr = array[0..1] of Byte;

function GetValue: TByteArr;
var
  hOpn: THandle;
  dwBytesRead: Cardinal;
  mBuf: TByteArr;
begin
  // 'ne Testdatei mit "17" am Ende erzeugen
  hOpn := CreateFile('test.dat', GENERIC_WRITE, 0, nil, CREATE_ALWAYS, 0, 0);
  if hOpn <> INVALID_HANDLE_VALUE then
  begin
    mBuf[0] := 8;
    mBuf[1] := 9;
    WriteFile(hOpn, mBuf, 2, dwBytesRead, nil);
    mBuf[0] := 1;
    mBuf[1] := 7;
    WriteFile(hOpn, mBuf, 2, dwBytesRead, nil);
    CloseHandle(hOpn);
  end;
  mBuf[0] := 0; // nur damit nicht noch die 17 vom Speichern drinsteht,
  mBuf[1] := 0; // da beim Lesen dwBytesRead nicht geprüft wird.


  // Auslesen
  hOpn := CreateFile('test.dat', GENERIC_READ, 0, nil, OPEN_EXISTING, 0, 0);
  if hOpn <> INVALID_HANDLE_VALUE then
  begin
    SetFilePointer(hOpn, -2, nil, FILE_END);
    ReadFile(hOpn, mBuf, 2, dwBytesRead, nil);
    showmessage(inttostr(mBuf[0]) + inttostr(mBuf[1]));
    result := mBuf;
    CloseHandle(hOpn);
  end;
end;

sk0r 8. Jun 2008 18:36

Re: Mit SetFilePointer zum Ende - n springen, wie?
 
Gut, mit CreateFile klappt es. Danke.


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