Недавно добавленные исходники

•  DeLiKaTeS Tetris (Тетрис)  3 709

•  TDictionary Custom Sort  5 837

•  Fast Watermark Sources  5 641

•  3D Designer  8 293

•  Sik Screen Capture  5 961

•  Patch Maker  6 422

•  Айболит (remote control)  6 415

•  ListBox Drag & Drop  5 272

•  Доска для игры Реверси  94 640

•  Графические эффекты  6 608

•  Рисование по маске  5 688

•  Перетаскивание изображений  4 793

•  Canvas Drawing  5 167

•  Рисование Луны  4 898

•  Поворот изображения  4 442

•  Рисование стержней  3 147

•  Paint on Shape  2 391

•  Генератор кроссвордов  3 259

•  Головоломка Paletto  2 581

•  Теорема Монжа об окружностях  3 358

•  Пазл Numbrix  2 228

•  Заборы и коммивояжеры  2 875

•  Игра HIP  1 853

•  Игра Go (Го)  1 766

•  Симулятор лифта  2 097

•  Программа укладки плитки  1 832

•  Генератор лабиринта  2 267

•  Проверка числового ввода  1 957

•  HEX View  2 257

•  Физический маятник  1 936

 
скрыть

  Форум  

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

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



Delphi Sources

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



Автор: 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-2025 "Delphi Sources" by BrokenByte Software. Delphi World FAQ

Группа ВКонтакте