Переменная 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 на различных ПЭВМ.

<p>16.3. Анализ ресурсов дисков</p>

Модуль 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('Жесткие и виртуальные диски:');

Перейти на страницу:

Поиск

Похожие книги