Получение размера файла
Автор: Eric Nielsen
Вот мой код, которым я пользуюсь для определения информации о
группе файлов:
var
Fhnd2: file;
sPath: string;
tpath: string;
SearchRec: TSearchRec;
tempsearch: string;
tempfiles: Integer;
tempbytes: LongInt;
wBytes: Word;
sTemp: string;
iLen: Integer;
szString: array[0..128] of Char;
ec: integer;
begin
{* Выбираем системный каталог *}
MailManLogS('Запуск MailMan');
sTemp := ParamStr(0);
iLen := Length(sTemp);
while sTemp[iLen] <> '\' do
DEC(iLen);
StrPCopy(szString, sTemp);
szString[iLen] := #0;
SysDir := StrPas(szString);
tempbytes := 0;
tempfiles := 0;
Files2bProc := 0;
Bytes2bProc := 0;
MailManLogS('Калькулируем файлы для обработки');
{* Подсчитываем, сколько файлов и байт должны быть обработаны *}
tempsearch := SysDir + 'spool\witchcrf\d\*.*';
ec := FindFirst(tempsearch, faSysFile, SearchRec);
while ec = 0 do
begin
if ((SearchRec.Name <> '.') and (SearchRec.Name <> '..')) then
begin
tempfiles := tempfiles + 1;
- - - - > tempbytes := tempbytes + SearchRec.Size;
< - - - - - -
TotalInBytes.Text := IntToStr(tempbytes);
TotalInFiles.Text := IntToStr(tempfiles);
MailManLogS('Файл-' + SearchRec.Name + ' Размер-' +
IntToStr(SearchRec.Size));
end;
ec := FindNext(SearchRec);
end;
MailManLogS('Всего файлов = ' + IntToStr(tempfiles) + ' Байт = ' +
IntToStr(tempbytes));
end;
|
В коде могут присутствовать синтаксические ошибки, т.к. я просто вырезал этот
код из своей программы, чтобы показать как работает функция FindFirst. Она
должна возвращать информацию о файле в SearchRec, который будет содержать любую
необходимую вам информацию о файле. Я думаю это то, что вам нужно, при этом нет
необходимости даже открывать файл.
Я все это делал с использованием FindFirst. Функция возвращает
запись, имеющую тип TSearchRec. Данная запись содержит переменную Size, которая
содержит размер файла в байтах. Это может быть не так красиво, но это
работает:
function GetFileSize(FileName: string): Longint;
var
SearchRec: TSearchRec;
begin
if FindFirst(FileName, faAnyFile, SearchRec) = 0 then
Result:=SearchRec.Size
else
Result:=-1; {возвращаем ошибку, это может быть число меньше нуля}
end;
|
В зависимости от предпочтений, можно выбрать одну из двух
приведенных ниже функций. В первой реализуется идея временного изменения
атрибутов файла, необходимого для его чтения. Вторая использует Windows API, но
не содержит средств проверки наличия ошибок.
function FileGetSize1(Filename: string): LongInt;
var
F: file;
OldFileAttr: Integer;
begin
if FileExists(Filename) then
begin
OldFileAttr := FileGetAttr(Filename);
FileSetAttr(Filename, OldFileAttr and (faReadOnly xor $FFFF));
try
AssignFile(F, Filename);
Reset(F, 1);
Result := FileSize(F);
CloseFile(F);
finally
FileSetAttr(Filename, OldFileAttr);
end;
end
else
Result := 0;
end;
function FileGetSize2(Filename: string): LongInt;
var
FileHandle: Integer;
begin
if FileExists(Filename) then
begin
FileName := FileName + chr(0);
FileHandle := _lopen(@FileName[1], 0);
Result := _llseek(FileHandle, 0, 2);
_lclose(FileHandle);
end
else
Result := 0;
end;
|
Я не стал возиться с AssignFile.
Function FileSizeInBytes(YourFile : String) : LongInt;
Var
F: Integer;
Begin
F:=FileOpen(YourFile,0); { режим ReadOnly }
FilesizeInBytes := FileSeek(F,0,2);
FileClose(F)
End;
|
Примечание: Проверка ошибок отсутствует !!!
|