Перейти к содержанию
Fire Monkey от А до Я
  • 0

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


Евгений Корепов

Вопрос

Нужно получить размер файла под любыми платформами.

Сейчас использую функцию

function TFileManager.GetFileSize(APath : String) : String;
Var F : file of Byte;
    AFileSizeByte : Integer;
    AFileSizeMbyte : Double;
begin
  Result:='';
  AssignFile(F, APath);
  FileMode := 0; // readonly
  try
    try
      Reset(F);
      AFileSizeByte:=FileSize(F);
      CloseFile(f);
    except
    end;
  finally
    AFileSizeMbyte:=AFileSizeByte/1048576;
    Result:=Format('%6.3f',[AFileSizeMbyte])+' Mbyte';
  end;
end;

Работает, но есть одно но - под Windows, если проверяю exe файл, антивирус (в данном случае Защитник Windows) унюхивает что производится открытие файла и начинает его проверять на вирусы. Из за этого сканирование директории с большим количеством исполняемых файлов подвешивает основной поток приложения.

 

Вопрос в следующем - нет ли другого способа получения размера? Странно что TFile, TPath или TDirectory не содержат такого полезного метода.

 

В данный момент двигаюсь в направлении отдельного потока получения размера, но решение не красивое, хочется быстро и сразу.

 

Ссылка на комментарий

Рекомендуемые сообщения

  • 0
uses System.IOUtils;

function GetFileSize(APath: String): String;
var
  Stream: TStream;
begin
  Stream := TFile.OpenRead(APath);
  try
    Result := Format('%f MBytes',[Stream.Size/1048576]);
  finally
    Stream.Free;
  end;
end;

Можно так сделать..

 

Эффект тот же. Этот способ я вторым проверил. 

Ссылка на комментарий
  • 0

Ура! Я победил проблему. Причем с помощью почти забытой мной процедуры FindFirst ;-) Код работает корректно под Windows и Android. Файл не передергивается, антивирус спокоен.

function TFileManager.GetFileSize(APath : String) : String;
Var AFileSizeByte : Int64;
    AFileSizeFloat : Double;
    SearchRec : TSearchRec;
    FileAttrs: Integer;
begin
  FileAttrs :=faArchive;
  FileAttrs := FileAttrs + faAnyFile;
  Result:='unknow';
  AFileSizeByte:=0;
  try
    FindFirst(APath,FileAttrs,SearchRec);
    AFileSizeByte:=SearchRec.Size;
    FindClose(SearchRec);
  except
      Exit;
  end;
  if AFileSizeByte<1024 then
  begin
    Result:=Format('%d',[AFileSizeByte])+' Byte';
    Exit;
  end;
  if AFileSizeByte<1048576 then
  begin
    AFileSizeFloat:=AFileSizeByte/1024;
    Result:=Format('%6.3f',[AFileSizeFloat])+' KByte';
    Exit;
  end;
  if AFileSizeByte<1073741824 then
  begin
    AFileSizeFloat:=AFileSizeByte/1048576;
    Result:=Format('%6.3f',[AFileSizeFloat])+' MByte';
    Exit;
  end;
  AFileSizeFloat:=AFileSizeByte/1073741824;
  Result:=Format('%6.3f',[AFileSizeFloat])+' GByte';
end;
Изменено пользователем Евгений Корепов
Ссылка на комментарий
  • 0

а под мак будет работать?

Думаю да, судя по исходникам под все платформы.

И кстати ошибка у меня в коде:

Note: FindFirst allocates resources (memory) that must be released by calling FindClose.

Забыл FindClose..

 

В хелпе есть упоминание мака, так что думаю будет работать точно.

Note: Some of the file attribute constants are not valid on all platforms. For example, faVolumeID and faArchive do not work on MAC OS

Ссылка на комментарий
  • 0
function FileSize(const aFilePath: string): Int64;
var
  vSR : TSearchRec;
begin
  if FindFirst(aFilePath, faAnyFile, vSR ) = 0 then
  begin
    Result := vSR.Size;
    FindClose(vSR);
  end
  else
     Result := -1;
end;

Мультиплатформенный вариант без открытия файла (размер берется из файловой системы).

Изменено пользователем ENRGY
Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...