23. Модуль DOS и другие средства

Модуль DOS объединяет средства, позволяющие выполнять некоторые функции операционной системы. Мы изучим лишь часть из них.

1. PROCEDURE GetDate(VAR Year, Month, Day, DayOfWeek. Word) - воз­вращает текущую дату : год, номер месяца, число и номер дня недели. 0 соответ­ствует воскресенью, 6 - субботе.

2. PROCEDURE GetTime(VAR Hour, Minute, Second, SeclOO: Word) - воз­вращает текущее время : часы, минуты, секунды и сотые доли секунды.

3. PROCEDURE FindFirst(Mos£: String; Attr: Byte; VAR F: SearchRec) -ищет в текущей или указанной директории первый файл, соответствующий за­данной маске и атрибуту. Возвращает информацию о файле в переменной F. Маска может включать путь (если путь не задан, то поиск происходит в текущей директории) и должна содержать либо имя файла, либо шаблон (с использовани­ем символа *). Параметр Attr может принимать одно из следующих значений:

ReadOnly

=$01

- файл только для чтения;

Hidden

=$02

- скрытый файл;

SysFile

=$04

- системный файл;

VolumeID

=$08

- заголовок тома;

Directory

=$10

- директория;

Archive

=$20

- архивный файл;

AnyFile

=$3F

- любой файл

либо быть равным какой-нибудь комбинации этих констант. Тип SearchRec оп­ределен в модуле DOS таким образом: TYPE SearchRec = RECORD

Fill : array[1..21] of Byte; Attr : Byte; Time : Longint;

Size : Longint; Name : STRING[12]; END; Здесь Attr - атрибут файла, Time - время создания файла в упакованном виде, Size - размер файла в байтах, Name - имя файла, Fill - системное поле. Для рас­паковки времени создания файла служит процедура

4. PROCEDURE UnpackTime(Time: Longint; VAR DT: DateTime) TYPE DateTime = RECORD

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

5. PROCEDURE FindNext(VAR F: SearchRec) - ищет следующий файл с ат­рибутами, заданными последним вызовом FindFirst. Процедуры FindFirst и FindNext возвращают через переменную.

6. VAR DosError : Integer

свой код завершения. Если значение этой переменной равно 0, процедура вы­полнилась успешно, в противном случае файл не был найден. Запишем програм­му, которая будет выводить на экран список файлов, имеющихся в корневой ди­ректории диска C и в текущей директории:

USES Crt,Dos;

PROCEDURE Find(Path:STRING; Attr:Byte);

VAR F : SearchRec; DT : DateTime; c : CHAR;

BEGIN FindFirst(Path+'*.*',Attr,F);

WHILE DosError=0 DO BEGIN

UnpackTime(F.Time,DT);

WITH F DO WRITELN(Name:12, Attr:4, DT.Year:5, DT.Month:3,

DT.Day:3,

DT.Hour:3, DT.Min:3, DT.Sec:3,Size:7);

FindNext(F);

END;

c:=ReadKey;

END;

BEGIN ClrScr;

WRITELN('------------------диск C---------------------'); Find('C:\',Archive+Hidden);

WRITELN('--------- текущая директория ------------'); Find('',Archive);

END.

Для поиска определенного файла на диске можно использовать функцию

7. FUNCTION FSearch(Name: PathStr; DirList: STRING): PathStr .

Здесь Name - имя файла возможно с добавлением пути (тип PathStr в модуле DOS определен как STRING[79]); DirList - список директорий, разделенных символами Функция возвращает полное имя файла, если он найден, или пус­тую строку. Определить, существует ли на диске файл, можно и не используя средства модуля DOS. Открытие несуществующего файла для чтения приводит к ошибке, код которой возвращает стандартная функция

8. FUNCTION IOResult: Integer .

Если значение функции не ноль, то последняя операция ввода-вывода (к ко­торым относится и открытие файла) не выполнилась. Чтобы предотвратить ава­рийное завершение программы, следует использовать опцию компилятора {$I} -контроль ввода-вывода:

VAR Name : STRING; f : FILE;

BEGIN

WRITE('Bведите имя файла '); READLN(Name); Assign(f,Name);

{SI-}

Reset(f,1);

IF IOResult<>0 THEN WRITELN('Файл не найден')

ELSE WRITELN('Файл найден !!!');

END.

Запись означает "отключить контроль ввода-вывода", а запись {$1+} -"включить контроль ввода-вывода". В таком тривиальном примере включать оп­цию I, конечно, необязательно, но в любой реальной программе вы обязательно должны использовать эту опцию компилятора парами {$1-} и {$1+}. Еще две функции модуля DOS предназначены для получения информации о логических дисках:

9. FUNCTION DiskSize(Disk: Byte): Longint - возвращает размер логическо­го диска в байтах, параметр Disk задает номер логического устройства: 0 - теку­щий диск, 1 - диск A, 2 - диск B, 3 - диск C и т.д. Если задан неверный номер устройства, функция возвращает значение -1, этим обстоятельством можно вос­пользоваться, чтобы определить наличие какого-либо диска в данном компьюте­ре.

10. FUNCTION DiskFree(Disk: Byte): Longint - возвращает свободное про­странство на диске в байтах.

Еще четыре процедуры, которыми заканчивается этот раздел, не входят в модуль DOS, но по своему назначению тесно связаны с этим модулем:

11. PROCEDURE GetDir(Disk : Byte; VAR S: STRING) - возвращает имя те­кущей директории на заданном диске.

12. PROCEDURE ChDir(Dir^awe : STRING) - изменяет текущую директо­рию; для того, чтобы выйти во внешнюю директорию, нужно задать параметр

13. PROCEDURE MkDir(Dir^awe : STRING) - создает в текущей директо­рии поддиректорию.

14. PROCEDURE RmDir(Dir^awe : STRING) - уничтожает пустую дирек­торию.