Delphi World - это проект, являющийся сборником статей и малодокументированных возможностей  по программированию в среде Delphi. Здесь вы найдёте работы по следующим категориям: delphi, delfi, borland, bds, дельфи, делфи, дэльфи, дэлфи, programming, example, программирование, исходные коды, code, исходники, source, sources, сорцы, сорсы, soft, programs, программы, and, how, delphiworld, базы данных, графика, игры, интернет, сети, компоненты, классы, мультимедиа, ос, железо, программа, интерфейс, рабочий стол, синтаксис, технологии, файловая система...
Получение размера файла

Автор: 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;

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

Проект Delphi World © Выпуск 2002 - 2004
Автор проекта: ___Nikolay