function GetFileSize(const FileName: string): LongInt;
var
  SearchRec: TSearchRec;
begin
  try
    if FindFirst(ExpandFileName(FileName), faAnyFile, SearchRec) = 0 then
      Result := SearchRec.Size
    else Result := -1;
  finally
    SysUtils.FindClose(SearchRec);
  end;
end;当文件较小时,返回值是正确的,可是,我要判断的是一个15G左右的文件,每次都是-402649088!
郁闷,这是怎么回事?我用另外一个“得到文件大小函数”来判断,一样!
function FSize(FileName: string): LongInt;
var
  F: File;
begin
  AssignFile(F, FileName);
  reset(F,1);
  Result := FileSize(F);
  CloseFile(F);
end;大家给我一个兼容性好一些的函数吧!

解决方案 »

  1.   

    function GetFileSizeByFileStream(const FileName:String):int64;
    var
       FileStream:TFileStream;
    begin
       Result:=0;
       FileStream:=TFileStream.Create(FileName,fmOpenRead,fmShareDenyNone);
       try
          Result:=FileStream.Size;
       finally
          FileStream.Free;
       end;
    end;
    function GetFileSizeByAPI(const FileName:String):int64;
    var
       FileHandle:THandle;
       HIFileSize:LongInt;
       LOFileSize:LongInt;
    begin
       Result:=0;
       FileHandle:=CreateFile(PChar(FileName),GENERIC_READ,FILE_SHARE_READ,nil,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
       try
          Result:=GetFileSize(FileHandle,@HIFileSize);
          Result:=Result+HIFileSize*4294967296;
       finally
          CloseHandle(FileHandle);
       end;
    end;
      

  2.   

    修正一下:
    function GetFileSizeByAPI(const FileName:String):int64;
    var
       FileHandle:THandle;
       HIFileSize:DWORD;
       LOFileSize:DWORD;
    begin
       Result:=0;
       FileHandle:=CreateFile(PChar(FileName),GENERIC_READ,FILE_SHARE_READ,nil,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
       try
          LOFileSize:=GetFileSize(FileHandle,@HIFileSize);
          Result:=LOFileSize+HIFileSize*4294967296;
       finally
          CloseHandle(FileHandle);
       end;
    end;
      

  3.   

    可以用下面的过程来测试:
    procedure TestGetFileSize;
    var
       FileStream:TFileStream;
    Begin
       FileStream:=TFileStream.Create('d:\test.mem',fmCreate);
       try
          FileStream.Size:=16896666398;//大概是15.7GB
       finally
          FileStream.Free;
       end;
       ShowMessage('GetFileSizeByFileStream(''d:\test.mem'')='+IntToStr(GetFileSizeByFileStream('d:\test.mem')))
       ShowMessage('GetFileSizeByAPI(''d:\test.mem'')='+IntToStr(GetFileSizeByAPI('d:\test.mem')))
    End;
      

  4.   

    使用FAT32、FAT16等不支持超大文件文件系统的朋友就不用上面的代码测试了。