Browse Source

Change TFile.Seek & Seek64 to take Int64.

Doesn't break existing callers, thanks to implicit conversion.
Seek64 is obsolete now, and can be removed later.

Also replaced SetFilePointer usage with SetFilePointerEx.
Jordan Russell 2 months ago
parent
commit
52babfefe1
1 changed files with 16 additions and 22 deletions
  1. 16 22
      Projects/Src/Shared.FileClass.pas

+ 16 - 22
Projects/Src/Shared.FileClass.pas

@@ -35,8 +35,8 @@ type
     class procedure RaiseLastError;
     function Read(var Buffer; Count: Cardinal): Cardinal; virtual; abstract;
     procedure ReadBuffer(var Buffer; Count: Cardinal);
-    procedure Seek(Offset: Cardinal);
-    procedure Seek64(Offset: Integer64); virtual; abstract;
+    procedure Seek(Offset: Int64); virtual; abstract;
+    procedure Seek64(Offset: Int64);
     procedure WriteAnsiString(const S: AnsiString);
     procedure WriteBuffer(const Buffer; Count: Cardinal); virtual; abstract;
     property CappedSize: Cardinal read GetCappedSize;
@@ -61,7 +61,7 @@ type
     constructor CreateWithExistingHandle(const AHandle: THandle);
     destructor Destroy; override;
     function Read(var Buffer; Count: Cardinal): Cardinal; override;
-    procedure Seek64(Offset: Integer64); override;
+    procedure Seek(Offset: Int64); override;
     procedure SeekToEnd;
     procedure Truncate;
     procedure WriteBuffer(const Buffer; Count: Cardinal); override;
@@ -84,7 +84,7 @@ type
     constructor CreateFromZero(const ASize: Cardinal);
     destructor Destroy; override;
     function Read(var Buffer; Count: Cardinal): Cardinal; override;
-    procedure Seek64(Offset: Integer64); override;
+    procedure Seek(Offset: Int64); override;
     procedure WriteBuffer(const Buffer; Count: Cardinal); override;
     property Memory: Pointer read FMemory;
   end;
@@ -196,9 +196,9 @@ begin
   end;
 end;
 
-procedure TCustomFile.Seek(Offset: Cardinal);
+procedure TCustomFile.Seek64(Offset: Int64);
 begin
-  Seek64(To64(Offset));
+  Seek(Offset);
 end;
 
 procedure TCustomFile.WriteAnsiString(const S: AnsiString);
@@ -248,15 +248,14 @@ begin
     FILE_ATTRIBUTE_NORMAL, 0);
 end;
 
-const
-  INVALID_SET_FILE_POINTER = DWORD($FFFFFFFF);
-
 function TFile.GetPosition: Integer64;
 begin
-  Result.Hi := 0;
-  Result.Lo := SetFilePointer(FHandle, 0, @Result.Hi, FILE_CURRENT);
-  if (Result.Lo = INVALID_SET_FILE_POINTER) and (GetLastError <> 0) then
+  { Store into an Int64 as it has 8-byte alignment, just in case the function
+    wants that (but it probably doesn't care) }
+  var LPosition: Int64;
+  if not SetFilePointerEx(FHandle, 0, @LPosition, FILE_CURRENT) then
     RaiseLastError;
+  Result := LPosition;
 end;
 
 function TFile.GetSize: Integer64;
@@ -273,20 +272,15 @@ begin
       RaiseLastError;
 end;
 
-procedure TFile.Seek64(Offset: Integer64);
+procedure TFile.Seek(Offset: Int64);
 begin
-  if (SetFilePointer(FHandle, Integer(Offset.Lo), @Offset.Hi,
-      FILE_BEGIN) = INVALID_SET_FILE_POINTER) and (GetLastError <> 0) then
+  if not SetFilePointerEx(FHandle, Offset, nil, FILE_BEGIN) then
     RaiseLastError;
 end;
 
 procedure TFile.SeekToEnd;
-var
-  DistanceHigh: Integer;
 begin
-  DistanceHigh := 0;
-  if (SetFilePointer(FHandle, 0, @DistanceHigh, FILE_END) = INVALID_SET_FILE_POINTER) and
-     (GetLastError <> 0) then
+  if not SetFilePointerEx(FHandle, 0, nil, FILE_END) then
     RaiseLastError;
 end;
 
@@ -393,9 +387,9 @@ begin
   end;
 end;
 
-procedure TMemoryFile.Seek64(Offset: Integer64);
+procedure TMemoryFile.Seek(Offset: Int64);
 begin
-  if Offset.Hi and $80000000 <> 0 then
+  if Offset < 0 then
     RaiseError(ERROR_NEGATIVE_SEEK);
   FPosition := Offset;
 end;