Вот мой код, которым я пользуюсь для определения информации о группе файлов:
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]