#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. Почти наверняка это не имеет значения, имейте в виду.