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

reklama-media.ru делаем вывески с учетом ваших корректировок.

Коробки от производителя proletarii.ru максимально выгодное предложение.

Передо мной никогда не стояла задача определения размера файла Delphi. Но после того как где-то увидел вопрос: «как определить размер файла«, мне тоже стало интересно.

Определение размера файла это то же самое, что определение роста удава в известном мультике! Сколько байтов в него поместится, таков и его размер. План такой:

  1. Задаём тип данных размером 1 байт. Это будет запись.
  2. Определяем файловую переменную этого типа.
  3. Начинаем с начала файла и переходим к концу. Сколько переходов — столько и байтов в файле!

Программа будет состоять из Формы, на которую бросим компонент выбора файла — OpenDialog и кнопку Button, по нажатию на которую и будем выбирать файл. Вот, собственно, и обработчик этой кнопки:

procedure TForm1.ButtonClick(Sender: TObject);
type TSize = Record
Bait: byte;
end;
var F: File of TSize;
Size: Integer;
begin
Size:=0;
with OpenDialog1 do
if Execute then
begin
AssignFile(F, FileName);
Reset(F);
while (not EOF(F)) do
begin
Size:=Size+1;
seek(F, Size);
end;
Form1.Caption:=IntToStr(Size); // Выводим информацию о размере в заголовок Формы
CloseFile(F);
end;
end;

Программа была написана за пять минут, что называется, «на коленке». Она работает, и для файлов размером до нескольких мегабайт время ожидания результата невелико, несколько секунд. Для больших файлов ожидание затягивается, и программа выглядит «зависшей». Можно изменить программу так, чтобы она считала килобайты (заменить seek(F, Size) на seek(F, Size*1024) ). Скорость работы возрастёт в 1024 раза, и уже будет приемлемой.

Это была ещё одна демонстрация приёмов работы с файлами. А на самом деле всё гораздо проще! Размер файла возвращается встроенной функцией FileSize. А файл достаточно описать как имеющий тип byte:

procedure TForm1.ButtonClick(Sender: TObject);
var F: File of byte;
Size: Integer;
begin
with OpenDialog1 do
if Execute then
begin
AssignFile(F, FileName);
Reset(F);
Size:=Filesize(F);
Form1.Caption:=IntToStr(Size); // Выводим информацию о размере в заголовок Формы
CloseFile(F);
end;
end;

Есть альтернативный способ работы с файлами Delphi, в котором файл рассматривается как объект. Там также есть встроенные способы определения размера файла. Также приведу процедуру целиком:

procedure TForm1.ButtonClick(Sender: TObject);
var F: TFileStream;
begin
with OpenDialog1 do
if Execute then
begin
F:=TFileStream.Create(Filename, fmOpenRead);
Caption:=IntToStr(F.Size);
F.Free;
end;
end;

Эта процедура выглядит компактнее, работает быстрее, но и требует дополнительной подготовки.

Функция возвратит размер файла FileName в байтах. Чтобы получить размер в килобайтах, результат нужно поделить на 1024.

По нажатию на кнопку выскочит мессаджбокс, с размерами исполняемого файла проекта.

В качестве параметра для функции GetFileSize было использовано ParamStr(0). Подробнее читаем в статье Определение пути к разрабатываемой программе

Обсудить на форуме

var
hFile, fileSize: Integer;
fileName: String;
begin
.
hFile := FileOpen(flieName, fmOpenRead);
fileSize := GetFileSize(hFile, nil);
FileClose(hFile);

// результат в переменной fileSize
end;

// Если файл не существует, то вместо размера файла функция верн¸т -1
function GetFileSize(FileName: String): Integer;
var
FS: TFileStream;
begin
try
FS := TFileStream.Create(Filename, fmOpenRead);
except
Result := -1;
end;
if Result <> -1 then Result := FS.Size;
FS.Free;
end;

function GetFileSize(namefile: string): Int64;
var
InfoFile: TSearchRec;
AttrFile: Integer;
ErrorReturn: Integer;
begin
AttrFile := $0000003F; // Any file
ErrorReturn := FindFirst(namefile, AttrFile, InfoFile);
if ErrorReturn <> 0 then
Result := -1 // в случае, если файл не найден
else
begin
Result := InfoFile.FindData.nFileSizeHigh; // Размер файла в байтах
Result := Result shl 32;
Result := Result or InfoFile.FindData.nFileSizeLow;
end;
FindClose(InfoFile);
end;

function GetNormalSize(Size: Int64): string;
var
kb, Mb, Gb: Real;
begin
Result := IntToStr(Size) + ‘ b’;
kb := Size / 1024;
kb := Trunc(kb * 10) / 10;
if kb

Posted by Chas under Топик-обзор

dolphin705:

assignfile ( f, ‘file.txt’ ) ;
append ( f ) ;
WriteLn ( f, inttostr ( x ) ) ;
closefile ( f ) ;

Serge_Bliznykov:
Кстати, данный код не сможет прочитать размер файла больше 2 Гб (а это в настоящее время вполне даже актуально, хотя, автору топика это вряд ли… ).

вот код, избавленный от этого недостатка:

if FileExists ( s ) then begin

FindFirstFile ( pchar ( s ) , SearchRec ) ;

result := SearchRec. nFileSizeHigh ;

result := result shl 32 ;

result := result + SearchRec. nFileSizeLow

var InfoFile: TSearchRec;

AttrFile := $0000003F ; // Any file

Error := FindFirst ( namefile, AttrFile, InfoFile ) ;

if Error <> 0 then result := -1

Result := InfoFile. FindData . nFileSizeHigh ;

Result := Result shl 32 ;

Result := Result or InfoFile. FindData . nFileSizeLow

Оцените статью