Как узнать размер файла
Вопрос банальный. Но имеет несколько решений.
Решение первое
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 МБ), остальные способы такого
ограничения не имеют.
Смотрите также:
|