Измените размер типа данных в GetFileSize

#delphi #delphi-7

#delphi #delphi-7

Вопрос:

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

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

 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: functionsgetfilesize - Unable to analyze file Attributes to determine filesize. '#13#10 e.message);
    end;
  

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

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

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

Вопрос: Знаете ли вы какие-либо другие функции замены, чтобы получить размер файла в большем целом числе?

Ответ №1:

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;     
  

Комментарии:

1. 1 Это хорошо. Иногда у вас есть имя файла, но нет дескриптора, в других случаях у вас есть дескриптор, но нет имени файла. 😉

2. @Craig Когда у вас есть дескриптор, это тривиально, вы вызываете GetFileSizeEx() .

3. windows.GetFileAttributesEx Что-нибудь плохое?

4. Я подозреваю, что @Sertac нет на D7.

5. @David — У меня нет D7, но он есть в D3.

Ответ №2:

попробуйте использовать 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;
  

Комментарии:

1. На 1 короче моего (теперь, когда я заставил его работать с D7), но дорогой, поскольку вам приходится создавать и уничтожать SearchRec. Почти наверняка это не имеет значения, имейте в виду.