- Регистрация
- 9 Май 2015
- Сообщения
- 1,562
- Баллы
- 155
Как узнать размер файла
Вопрос банальный. Но имеет несколько решений.
Решение первое
Решение второе
Решение третье
Решение четвертое
Решение пятое
Какое решение использовать? Вам решать, но не рекомендую использование третьего и пятого вариантов, так как они ограничивается типамиIntegerиCardinalсоответственно, то есть2147483647и4294967295байтами (2047и4094МБ), остальные способы такого ограничения не имеют.
Вопрос банальный. Но имеет несколько решений.
Решение первое
Код:
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МБ), остальные способы такого ограничения не имеют.