Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Получение точного размера файла на диске в Delphi и Pascal

Delphi , Синтаксис , Справочник по API-функциям

Для получения точного размера файла на диске в среде разработки Delphi и Pascal, необходимо учитывать особенности работы файловой системы и механизмов компрессии файлов. Размер файла на диске может отличаться от его фактического размера в памяти, особенно если файл сжат или используется механизм "sparse file".

Проблема

Пользователь хочет воспроизвести поведение, которое реализовано в диалоговом окне "Свойства" -> "Общие" файла в Windows Explorer, а именно получить точное значение поля "Размер на диске".

Решение

Для решения задачи можно использовать функцию GetFileInformationByHandleEx, которая позволяет получить структуру FILE_STANDARD_INFO или FILE_ID_BOTH_DIR_INFO, где в поле AllocationSize будет содержаться нужная информация о размере файла на диске.

Пример кода на Object Pascal (Delphi)

uses
  System.SysUtils,
  Windows;

function GetFileSizeOnDisk(const FileName: string): Int64;
var
  FileHandle: THandle;
  FileInfo: TFileStandardInfo;
begin
  Result := 0;
  FileHandle := CreateFile(PChar(FileName), 0, FILE_SHARE_READ, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
  if FileHandle = INVALID_HANDLE_VALUE then
    Exit;

  SetLength(FileInfo, SizeOf(TFileStandardInfo));
  if not GetFileInformationByHandle(FileHandle, @FileInfo, SizeOf(TFileStandardInfo), nil, nil) then
  begin
    CloseHandle(FileHandle);
    Exit;
  end;

  Result := FileInfo.AllocationSize;
  CloseHandle(FileHandle);
end;

Альтернативный подход

Также можно использовать функцию GetCompressedFileSize, которая возвращает размер сжатого файла или размер файла, скорректированный с учетом размера кластера, если файл не сжат.

Пример функции FindSizeOnDisk

uses
  System.SysUtils,
  Windows;

function FindSizeOnDisk(const FileName: string): Int64;
var
  ClusterSize: Int64;
  FileSize, SizeOnDisk: Int64;
  Drive: string;
  SectorsPerCluster, BytesPerSector, Dummy: DWORD;
begin
  Result := 0;
  Drive := IncludeTrailingPathDelimiter(ExtractFileDrive(FileName));
  if not GetDiskFreeSpace(PChar(Drive), SectorsPerCluster, BytesPerSector, Dummy, Dummy) then
    Exit;

  ClusterSize := SectorsPerCluster * BytesPerSector;

  FileSize := GetFileSize(PChar(FileName), SizeOnDisk);
  if FileSize = INVALID_FILE_SIZE then
    Exit;

  if (FileSystemFlags AND FILE_FILE_COMPRESSION) <> 0 then
  begin
    SizeOnDisk := GetCompressedFileSize(PChar(FileName), @HighSize);
  end
  else
  begin
    if FileSize mod ClusterSize > 0 then
      SizeOnDisk := FileSize + (ClusterSize - (FileSize mod ClusterSize));
    else
      SizeOnDisk := FileSize;
  end;
  Result := SizeOnDisk;
end;

Важные замечания

  • Функция GetCompressedFileSize учитывает компрессию и механизмы "sparse file", поэтому она может быть предпочтительнее для получения размера файла на диске.
  • Размер файла на диске может быть округлен до размера кластера, поэтому важно учитывать размер кластера при расчетах.
  • Функция GetFileInformationByHandleEx может быть не доступна на всех версиях Windows, поэтому необходимо учитывать это при разработке кросс-платформенного программного обеспечения.

Используя предложенные функции и примеры кода, разработчики могут воспроизвести поведение Windows Explorer и получить точный размер файла на диске в среде Delphi и Pascal.

Создано по материалам из источника по ссылке.

Для получения точного размера файла на диске в Delphi и Pascal необходимо использовать специальные функции, учитывающие особенности файловой системы и компрессии файлов, такие как `GetFileInformationByHandleEx` или `GetCompressedFileSize`.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




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


:: Главная :: Справочник по API-функциям ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-01-13 19:02:51/0.0035309791564941/0