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

Delphi site: daily Delphi-news, documentation, articles, review, interview, computer humor.

Иногда возникает необходимость узнать размер файла. Лично я с такой проблемой встречаюсь совершенно в разных программах, и это не зависит от их специфики и принадлежности. Такая проблема может встать даже в приложении, которое работает с базой данных.

Для этого есть три способа. Первый — открыть файл и перейти в конец. Переход по файлу возвращает текущую позицию, а раз текущая позиция — это конец, то это и будет размер:

Этот способ основан на специфике функций работы с файлом. В приведенном коде открывается нужный файл в режиме «для чтения». После этого, для того чтобы определить размер файла, указатель в файле перемещается на самый конец. Вот тут-то и кроется секрет определения. При перемещении указателя с помощью API-функции _seek она возвращает количество байт, на которые переместился указатель. Так как мы перемещаем его из самого начала в самый конец, то функция возвращает нам размер всего файла. Узнав необходимую информацию, файл можно закрывать.

Второй способ основан на поиске файла, который также возвращает размер.

begin //Ищем файл

if FindFirst(ExpandFileName(FileName),faAnyFile,SearchRec)=0 then //Забираем размер

Здесь запущен поиск файла с помощью функции Если функция вернула о, значит, файл найден удачно. В этом случае в свойстве size структуры searchRect находится полный размер файла.

Третий способ — это получение размера файла напрямую через функцию

В качестве первого параметра фигурирует указатель на файл, а второй — указатель на число DWORD, куда будет помещен старший байт размера файла.

Не пугайтесь, старший байт вам может не понадобиться, очень редко встречаются файлы больше 2 Гбайт. Поэтому можно смело использовать в качестве второго параметра nil. Младший байт нам вернет сама функция.

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