Советы по Delphi

         

Получение размера файла


Вот мой код, которым я пользуюсь для определения информации о группе файлов:

    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;

[Eric Nielsen, htrsoft@midwest.net]

Я не стал возиться с AssignFile.

    Function FileSizeInBytes(YourFile : String) : LongInt;
Var
F : Integer; Begin
F:=FileOpen(YourFile,0);  { режим ReadOnly } FilesizeInBytes := FileSeek(F,0,2); FileClose(F) End;

Примечание: Проверка ошибок отсутствует !!! [001688]



Содержание раздела