Переді мною ніколи не стояло завдання визначення розміру файлу Delphi. Але після того як десь побачив питання: "як визначити розмір файлу", мені теж стало цікаво.
Визначення розміру файлу це те ж саме, що визначення зростання удава у відомому мультику! Скільки байтів в нього поміститься, такий і його розмір. План такий:- Задаємо тип даних розміром 1 байт. Це буде запис.
- Визначаємо файлову змінну цього типу.
- Починаємо з початку файлу і переходимо до кінця. Скільки переходів - стільки і байтів у файлі!
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;
Ця процедура виглядає компактніше, працює швидше, але і вимагає додаткової підготовки.