скрыть

скрыть

  Форум  

Delphi FAQ - Часто задаваемые вопросы

| Базы данных | Графика и Игры | Интернет и Сети | Компоненты и Классы | Мультимедиа |
| ОС и Железо | Программа и Интерфейс | Рабочий стол | Синтаксис | Технологии | Файловая система |



Google  
 

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



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

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






Copyright © 2004-2016 "Delphi Sources". Delphi World FAQ




Группа ВКонтакте   Ссылка на Twitter   Группа на Facebook