Счетчик HotLog

На главнуюЧто я делаю...Программы автора и не только...Творчество
Статьи автораКнига отзывов и предложенийОбо мне, любимомФотоальбом

 
 

Как узнать размер файла

Вопрос банальный. Но имеет несколько решений.

Решение первое

uses
  Classes;

// Вернуть размер файла.
function GetFileSize(
  // Имя файла.
  const FileName: String;
  // Размер файла.
  out FileSize: Int64): Boolean; forward;

function GetFileSize(const FileName: String; out FileSize: Int64): Boolean;
var
  FileStream: TFileStream;
begin
  try
    FileStream := TFileStream.Create(FileName, fmOpenRead);
    try
      FileSize := FileStream.Size;
      Result := True;
    finally
      FileStream.Free;
    end;
  except
    Result := False;
  end;
end;

Решение второе

uses
  Windows;

// Вернуть размер файла.
function GetFileSize(
  // Имя файла.
  const FileName: String;
  // Размер файла.
  out FileSize: Int64): Boolean; forward;

function GetFileSize(const FileName: String; out FileSize: Int64): Boolean;
var
  FileHandle: THandle;
  FileSizeLow, FileSizeHigh: DWORD;
begin
  FileHandle := CreateFile(PAnsiChar(FileName), GENERIC_READ, FILE_SHARE_READ,
    nil, OPEN_EXISTING, FILE_ATTRIBUTE_ARCHIVE, 0);
  Result := FileHandle <> INVALID_HANDLE_VALUE;
  if Result then
  try
    FileSizeLow := Windows.GetFileSize(FileHandle, @FileSizeHigh);
    Int64Rec(FileSize).Hi := FileSizeHigh;
    Int64Rec(FileSize).Lo := FileSizeLow;
  finally
    CloseHandle(FileHandle);
  end;
end;

Решение третье

uses
  SysUtils;

// Вернуть размер файла.
function GetFileSize(
  // Имя файла.
  const FileName: String;
  // Размер файла.
  out FileSize: Integer): Boolean; forward;

function GetFileSize(const FileName: String; out FileSize: Integer): Boolean;
var
  SearchRecord: TSearchRec;
begin
  Result := FindFirst(FileName, faAnyFile, SearchRecord) = 0;
  if Result then
  try
    FileSize := SearchRecord.Size;
  finally
    FindClose(SearchRecord);
  end;
end;

Решение четвертое

uses
  SysUtils, Windows;

// Вернуть размер файла.
function GetFileSize(
  // Имя файла.
  const FileName: String;
  // Размер файла.
  out FileSize: Int64): Boolean; forward;

function GetFileSize(const FileName: String; out FileSize: Int64): Boolean;
var
  Win32FindData: TWin32FindData;
  FileHandle: THandle;
begin
  FileHandle := FindFirstFile(PAnsiChar(FileName), Win32FindData);
  Result := FileHandle <> INVALID_HANDLE_VALUE;
  if Result then
  try
    Int64Rec(FileSize).Hi := Win32FindData.nFileSizeHigh;
    Int64Rec(FileSize).Lo := Win32FindData.nFileSizeLow;
  finally
    Windows.FindClose(FileHandle);
  end;
end;

Решение пятое

// Вернуть размер файла.
function GetFileSize(
  // Имя файла.
  const FileName: String;
  // Размер файла.
  out FileSize: Cardinal): Boolean; forward;

function GetFileSize(const FileName: String; out FileSize: Cardinal): Boolean;
var
  AFile: File of Byte;
begin
  Result := False;
  AssignFile(AFile, FileName);
  Reset(AFile);
  try
    FileSize := System.FileSize(AFile);
    Result := True;
  finally
    CloseFile(AFile);
  end;
end;

Какое решение использовать? Вам решать, но не рекомендую использование третьего и пятого вариантов, так как они ограничивается типами Integer и Cardinal соответственно, то есть 2147483647 и 4294967295 байтами (2047 и 4094 МБ), остальные способы такого ограничения не имеют.

Смотрите также:

 
 

18.03.2007

 
     
Hosted by uCoz