Работа с датой создания файлов




Работа с датой создания файлов — в общем-то, не первая необходимость. Но для написания антивирусных программ, для ведения картотек и баз данных или анализа файлов данных — это «рабочий» инструмент.

Для работы с файлами в модуле DOS вводится предопределенный тип с именем DateTime. Это запись со структурой

TYPE

DateTime = RECORD

Year, Month, Day, Hour, Min, Sec: Word;

END; {352}

Поля этой записи представляют собой нормальные значения даты и времени, с ограничением лишь на диапазон возможных значений: Year имеет диапазон 1980...2099, Month — 1...12, Day — 1...31, Hour — 0...23, Min и Sec — 0...59.

В MS-DOS вся эта информация упакована в четыре байта, что соответствует типу LongInt Турбо Паскаля. Для преобразования даты и времени в формат MS-DOS служит процедура

PackTime(VAR DT: DateTime; VAR Т: LongInt)

Для обратного кодирования из LongInt в DateTime служит процедура

UnPackTime (Т: LongInt; VAR DT: DateTime)

Но обе эти процедуры имеют смысл только в сопряжении с процедурами чтения и записи времени создания файла:

GetFTime(VAR f; VAR Т: LongInt)

и

SetFTime(VAR f; Т: LongInt)

Переменная 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 {353}

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

Анализ ресурсов дисков

Модуль DOS включает в себя две функции для анализа дисков:

DiskFree(D: Word): LongInt {354}

и

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('Жесткие и виртуальные диски:'); while disk > -1 do begin WriteLn('Диск '+ch+': -> ОБЪЕМ=', disk:8, ' Байт; СВОБОДНО ', DiskFree(i),' Байт'); Inc(i); ch:= Succ(ch); { следующий диск } disk:= DiskSize(i) end; {while} END.

Рис. 16.6

Первая строка тела процедуры проверяет количество накопителей на гибких дисках (для применения к ним процедур DiskSize и DiskFree надо быть уверенным, что в дисководы вставлены дискеты и шторки на них задвинуты). Далее цикл While анализирует жесткие и виртуальные диски. Цикл продолжается до первого отсутствующего диска. При этом мы считаем, что первый жесткий диск имеет обозначение C:. {355}

Для того чтобы получить значения размеров в килобайтах, достаточно поделить получаемые цифры на 1024, например:

disk:= DiskSize(i) div 1024

Полученное число будет ближайшим меньшим целым числом K.

Проверка самого факта существования в ПЭВМ дисковода может производиться непосредственным вызовом функции MS-DOS. Пример этого будет рассмотрен в разд. 16.5.3 «Процедура MsDos».



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2022-11-01 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: