Изменить размер типа данных на GetFileSize - PullRequest
0 голосов
/ 17 марта 2011

Использование Delphi 7 для разработки нашего основного приложения. Мы импортируем файлы данных. Размер файла в байтах превышает размер целочисленной переменной, которую использует vcl и мой код для ее хранения ... поэтому он становится отрицательным, и выполняются действия с пустым файлом ...

Наш текущий код для проверки размера файла (и, следовательно, определения, является ли он пустым):

function getfilesize(vfilename: string): integer;
var
  SearchRec: TSearchRec;
begin
    try
    result:= -1;
    if FindFirst(vfilename, faAnyFile, SearchRec) = 0 then
      result:= SearchRec.Size;
    FindClose(SearchRec);
    except
      on e: exception do
        raise exception.create('Error: functions\getfilesize - Unable to analyze file Attributes to determine filesize. '#13#10+e.message);
    end;

За прошедшие годы это изменилось взад и вперед, но за последние 5 лет это изменилось работал хорошо.

searchrec.size это INTEGER, поэтому просто измените наш тип возвращаемого значения не будет достаточно. Есть много других факторов, связанных с нашим кодом и полями базы данных, которые мы используем.

В: Какие еще методы D7 определения размера файла в байтах будут работать для нас, которые используют больший тип данных?

В: Известны ли вам какие-либо другие функции замены для getFilesize с большим целым числом?

Ответы [ 2 ]

8 голосов
/ 17 марта 2011

GetFileAttributesEx() - наиболее удобный Windows API для вызова.Это самый быстрый и в отличие от GetFileSize() не требует получения дескриптора файла.

Оберните его так:

function FileSize(const FileName: string): Int64; overload;
var
  AttributeData: TWin32FileAttributeData;
begin
  if not GetFileAttributesEx(PChar(FileName), GetFileExInfoStandard, @AttributeData) then
    RaiseLastOSError;
  Int64Rec(Result).Lo := AttributeData.nFileSizeLow;
  Int64Rec(Result).Hi := AttributeData.nFileSizeHigh;
end;

Если у вас есть дескриптор файла, то GetFileSizeEx(), вероятно, лучше всего:

function GetFileSizeEx(hFile: THandle; var FileSize: Int64): BOOL; stdcall; external kernel32;

function FileSize(hFile: THandle): Int64; overload;
begin
  if not GetFileSizeEx(hFile, Result) then
    RaiseLastOSError;
end;     
2 голосов
/ 17 марта 2011

попробуйте использовать FindData.nFileSizeHigh и FindData.nFileSizeLow, вы можете написать что-то вроде этого:

 function GetFileSizeExt(const FileName : TFileName) : Int64;
 var
   SearchRec : TSearchRec;
 begin
   if FindFirst(FileName, faAnyFile, SearchRec ) = 0 then
      result := Int64(SearchRec.FindData.nFileSizeHigh) shl Int64(32) + Int64(SearchRec.FindData.nFileSizeLow)
   else
      result := -1;

   FindClose(SearchRec) ;
 end;
...