Переменная f в них обозначает файл произвольного типа, вернее его логическое имя. Этот файл к моменту вызова процедур GetTime/SetTime должен быть связан с каким-либо физическим файлом на диске и открыт для записи или чтения. Переменная T в первом случае возвращает упакованные дату и время, во втором — содержит и устанавливает их. Сказанное можно проиллюстрировать программой чтения и установки даты создания файлов (рис. 16.5).
| { ПРИМЕР СМЕНЫ ДАТЫ СОЗДАНИЯ ФАЙЛА }
| USES DOS;
| { Процедура назначает файлу Fname дату и время NewDT. }
| PROCEDURE ChangeFtime(Fname: String; NewDT: DateTime);
| VAR
| f : File; { переменная для любого файла }
| ftime : LongInt; { переменная для Get/SetFTime }
| dt : DateTime; { переменная для Pack/UnpackTime }
| BEGIN
| Assign( f, Fname); { связь f с файлом }
| {$I-} Reset( f ); {$I+} { попытка открытия файла}
| if IOResult<>0 then
| Exit; { выход, если файла нет }
| GetFTime( f, ftime); { считывание времени }
| UnpackTime( ftime, dt ); { расшифровка времени }
Рис. 16.5
- 354 -
| with dt do
| WriteLn(Дата и время создания файла '+Fname+' : ',
| Day :1, '-', Month:1, '-', Year:1, ' ',
| Hour:1, ':', Min :1, ':', Sec :1 );
| PackTime( NewDT, ftime ); { упаковка новой даты }
| SetFTime( f, ftime ); { назначение ее файлу }
| Close( f ); { закрытие файла }
| with NewDT do
| WriteLn('Новые дата и время создания файла : ',
| Day :1, '-', Month:1, '-', Year:1, ' ',
| Hour:1, ':', Min :1, ':', Sec :1 );
| END; { ChangeFTime }
| { -- ПРИМЕР ВЫЗОВА ПРОЦЕДУРЫ -- }
| CONST
| NewDT : DateTime = ( Year:1991; Month:1; Day:1;
| Hour:5; Min:5; Sec:0 );
| BEGIN
| ChangeFTime( 'TEST.PAS', NewDT );
| ReadLn { пауза до нажатия клавиши ввода }
| END.
Рис. 16.5 (окончание)
Процедура GetFTime работает с файлами, открытыми как для записи ( через Rewrite или Append ), так и для чтения (Reset). Однако процедуру SetFTime следует применять только к файлам, открытым для чтения. В противном случае процедура закрытия файла Close переустановит значение времени и даты на текущее системное. Чтобы избежать этого, можно вставить перед вызовом SetFTime оператор Reset, переоткрывающий этот же файл, но уже для чтения. Дальнейшая запись в него будет, правда, невозможна, но все это можно проделать непосредственно перед закрытием файла, и проблемы не будет.
При тестировании демонстрационной программы мы заметили необычный эффект (Турбо Паскаль 5.5, MS-DOS 3.30, PS/2-50): при назначении файлу времени 0 ч 0 мин 0 с MS-DOS переставала выдавать время создания файлов при подаче команды DIR. Возможно, этот эффект будет сохраняться в различных версиях DOS на различных ПЭВМ.
16.3. Анализ ресурсов дисков
Модуль DOS включает в себя две функции для анализа дисков:
DiskFree( D : Word ) : LongInt
- 355 -
и
DiskSize( D : Word ) : LongInt
Обе функции возвращают длинное целое число — размер свободного пространства на диске и общую вместимость диска в байтах соответственно.
Параметром является целая переменная или целое число, указывающее на конкретный диск. Если D = 0, то анализируется текущий диск, D = 1 соответствует диску A: , D = 2 — диску B: и т.д.
Если система не может установить соответствие введенного значения параметра D конкретному диску, то функции будут возвращать значение (-1). Эту особенность можно использовать для определения характеристик подключенных к ПЭВМ дисководов (хотя это не самый эффективный способ), как это показано в программе на рис. 16.6.
| { ПРОГРАММА АНАЛИЗА ЖЕСТКИХ И ВИРТУАЛЬНЫХ ДИСКОВ }
| USES DOS;
| VAR i : Byte; disk : LongInt; { объем дисков }
| ch : Char; { буква диска }
| BEGIN
| { Анализ ячейки системной памяти ПЭВМ: }
| i := ( Mem[0:$411] shr 6 ) + 1;
| WriteLn( #10'Дисководов для гибких дисков:', i );
| i:= 3; ch:= 'С'; disk:= DiskSize(i); { начало анализа }
| if disk>0 then WriteLn('Жесткие и виртуальные диски:');