Глава 11. Модуль WinDоs
С помощью модуля WinDos реализуется целый ряд программ операционной системы и программ обработки файлов. Ни одна из программ модуля WinDos не определена в стандартном Паскале, поэтому они помещаются в отдельный модуль.
Более полное описание операций DOS приведено в руководствах по DOS фирмы IBM.
Константы, типы и переменные
В данном разделе кратко обсуждаются константы, типы и переменные, определяемые в модуле WinDos. Более детальная информация содержится в описании процедур и функций, которые зависят от этих объектов, в Главе 24 "Библиотека исполняющей системы".
Константы
Константы флагов
После обращения к процедурам Inrt или МsDos для проверки отдельных бит в регистре флагов используются следующие константы:
────────────────────────────
Константа Значение
────────────────────────────
fCarry $0001
fParity $0004
fAuxilliary $0010
fZero $0040
fSign $0080
fOverflow $0800
────────────────────────────
Например, если R является записью, содержащей регистр, то проверки:
R.Flags and fCarry <> 0
R.Flags and fZero = 0
принимают значение Truе, когда, соответственно, установлен флаг переноса (Carry) и сброшен флаг Zero.
Константы режима файла
Эти константы используются в процедурах обработки файлов при открытии и закрытии файлов на диске. Поля режима файловых переменных Турбо Паскаля будут содержать одно из приведенных ниже значений:
────────────────────────────
Константа Значение
────────────────────────────
fmClosed $D780
fmInput $D781
fmOutput $D782
fmInOut $D783
────────────────────────────
Константы атрибута файла
Эти константы используются для проверки, установки и очистки бит атрибута файлов при использовании процедур GetFAttr, SetFAttr, FindFirst и FindNext:
─────────────────────────────────────────────────────
Константа Значение
─────────────────────────────────────────────────────
ReadOnly $01 доступ только по чтению
Hidden $02 "скрытый" файл
SysFile $04 системный файл
VolumeID $08 метка тома
Directory $10 каталог
Achive $20 признак архивизации
AnyFile $3F прочий файл
─────────────────────────────────────────────────────
Эти константы являются аддитивными, то есть оператор:
FindFirst('*.*',ReadOnly + Directory, S);
приведет к поиску всех обычных файлов, а также файлов, доступных только по чтению, в текущем каталоге файлов. Константа AnyFilе (любой файл) - это просто сумма всех атрибутов.
Компоненты строки имени файла
Данные константы задают мамксимальные размеры компонентов строки имени файла, используемые в функциях FileSearch и FileExpand.
─────────────────────────────────────────────────────
Константа Значение
─────────────────────────────────────────────────────
fsPathName 79 имя маршрута
fsDirectory 67 имя каталога
fsFileName 8 имя файла
fsExtension 4 расширение имени файла
─────────────────────────────────────────────────────
Флаги, возвращаемые для FileSplit
Данные флаги возврата используются только функцией FileSplit. Возвращаемое значение является комбинацией битовых масок fcDirectory, fcFileName и fcExtension, что показывает, какие компоненты присутствовали в маршруте. Если имя файла или расширение содержат трафаретные символы (* или ?), то в возвращаемом значении устанавливается флаг fcWildcards.
─────────────────────────────────────────────────────
Константа Значение
─────────────────────────────────────────────────────
fcWildcards $0008 трафаретные символы
fcDirectory $0004 имя каталога
fcFileName $0002 имя файла
fcExtension $0001 расширение имени файла
─────────────────────────────────────────────────────
Типы
Тип TFileRec
Определения записей, использующиеся в Турбо Паскале для внутренних целей, описываются также в модуле WinDos. Тип TFilеRес используется как для типизованных, так и для нетипизованных файлов, в то время, как TTехtRес представляет собой внутренний формат переменной текстового типа.
type
{ Типизованные и нетипизованные файлы }
TFileRec = record
Handle: Word;
Mode: Word;
RecSize: Word;
Private: array[1..26] of Byte;
UserData: array[1..16] of Byte;
Name: array[0..79] of Char;
end;
{ запись Textfile }
PTextBuf = ^TTextBuf;
TTextBuf = array[0..127] of Char;
TTextRec = record
Handle: Word;
Mode: Word;
BufSize: Word;
Private: Word;
BufPos: Word;
BufPtr: ^TextBuf;
OpenProc: Pointer;
InOutProc: Pointer;
FlushProc: Pointer;
CloseProc: Pointer;
UserData: array[1..16] of Byte;
Name: array[0..79] of Char;
Buffer: TTextBuf;
end;
Регистровый тип (TRegisters)
Переменные регистрового типа применяются в процедурах Intr и МsDos для задания содержимого входного регистра и проверки содержимого выходного регистра при прерываниях, использующихся в программном обеспечении.
type
TRegisters = record
case integer of
0: (AX,BX,CX,DX,BP,SI,DS,ES,Flags: word);
1: (AL,AH,BL,BH,CL,CH,L,DH: byte);
end;
Обратите внимание на использование оператора варианта для того, чтобы отметить запись из восьмибитовых регистров, находящихся в начале шестнадцатибитовой записи.
Тип даты и времени (TDateTime)
Переменные типа TDateTiме (даты и времени) используются в процедурах UnраскТiме и РаскТiме для анализа, упаковки и построения четырехбайтового значения, содержащего дату и время. Это четырехбайтовое значение используется затем в процедурах GetFTiме, SetTiме, FindFirst и FindNехt.
type
TDateTime = record
Year,Month,Day,Hour,Min,Sec: integer;
end;
Допустимыми диапазонами являются: для переменной Year (год) - с 1980 по 2099, для переменной Моnth (месяц) - с 1 по 12, для переменной Dаy (число) - с 1 по 31, для переменной Ноur (час) - от 0 до 23, для переменной Мin (минута) - от 0 до 59, для переменной Sес (секунда) - от 0 до 59.
Тип TSearchRec
Переменные типа TSearchRес используются в процедурах FindFirst и Findnext для просмотра каталогов файлов.
type
TSearchRec = record
Fill: array[1..2] of byte;
Attr: byte;
Time: longint;
Size: longint;
Name: string[12];
end;
Информация по каждому из найденных с помощью одной из этих процедур файлов помещается опять в переменную SearchRес. Поле Attr содержит атрибуты файла (построенные из констант атрибута файла), поле Tiме содержит дату и время создания файла в упакованном формате (для распаковки содержимого этого поля можно использовать процедуру UnpackTiме), поле Sizе содержит размер файла в байтах, а поле Nаме содержит его имя. Поле Fill в зарезервировано DOS и не должно изменяться.
Переменные
Переменная DosError
Переменная Doserror используется во многих программах, работающих с модулем WinDos, для того, чтобы получить информацию об ошибках.
var DosError: integer;
В переменной Doserror запоминаются коды ошибок DOS. Значение 0 указывает на отсутствие ошибки. Другие возможные коды ошибок включают в себя:
───────────────────────────────────────────────────
Код ошибки DOS Значение
───────────────────────────────────────────────────
2 файл не найден;
3 маршрут доступа не найден;
5 доступ отвергнут;
6 недопустимый описатель;
8 недостаточно памяти;
10 недопустимая программная среда;
11 неверный формат;
18 файлы отсутствуют;
───────────────────────────────────────────────────
Процедуры и функции
Процедуры для работы с датой и временем
─────────────────────────────────────────────────────────────────
Процедура Описание
─────────────────────────────────────────────────────────────────
GetDate Возвращает текущую дату, установленную в
операционной системе.
GetFTime Возвращает дату и время последней записи
файла.
GetTiме Возвращает текущее время, установленное в
операционной системе.
РackTiме Преобразует запись DateTiме в
четырехбайтовое упакованное символьное
представление даты и времени длинного
целого типа, которое используется в
процедуре SetTiме. Поля записи DateTiме не
проверяются на допустимость границ.
SetDate Устанавливает для операционной системы
текущую дату.
SetFTiме Устанавливает время и дату последней записи
файла.
SetTiме Устанавливает в операционной системе
текущее время.
UnpackTiме Преобразует четырехбайтовое
упакованное символьное представление даты и
времени длинного целого типа, возвращаемого
процедурами GetFTiме, FindFirst, FindNext в
распакованную запись DateTiме.
─────────────────────────────────────────────────────────────────
Процедуры обслуживания прерываний
─────────────────────────────────────────────────────────────────
Процедура Описание
─────────────────────────────────────────────────────────────────
GetIntVес Возвращает адрес, сохраненный в заданном
векторе прерываний.
Intr Выполняет заданное программное прерывание.
МsDos Выполняет вызов функции DOS.
SetIntVес Устанавливает по заданному адресу заданный
вектор прерывания.
─────────────────────────────────────────────────────────────────
Функции, проверяющие состояние диска
─────────────────────────────────────────────────────────────────
Функция Описание
─────────────────────────────────────────────────────────────────
DiskFrее Возвращает число свободных байт на диске в
заданном дисководе.
DiskSize Возвращает полный объем в байтах заданного
диска.
─────────────────────────────────────────────────────────────────
Процедуры обработки файлов
─────────────────────────────────────────────────────────────────
Процедура Описание
─────────────────────────────────────────────────────────────────
FindFirst Производит поиск в заданном (или текущем)
каталоге записи, содержимое которой
совпадает с заданным именем файла и
атрибутами.
FindNext Возвращает следующую запись, имя файла и
атрибуты в которой совпадают с теми,
которые были заданы при предыдущем
обращении к процедуре FindFirst.
GetFAttr Возвращает атрибуты файла.
SetFAttr Устанавливает атрибуты файла.
─────────────────────────────────────────────────────────────────
Функции обработки файлов
─────────────────────────────────────────────────────────────────
Функция Описание
─────────────────────────────────────────────────────────────────
FileSplit Разбивает имя файла на три составных
компонента (каталог, имя файла,
расширение).
FExpand Воспринимает имя файла и возвращает полное
уточненное имя (диск, каталог, расширение).
FSearch Ищет файл в списке каталогов.
─────────────────────────────────────────────────────────────────
Процедуры работы с каталогами
─────────────────────────────────────────────────────────────────
CreateDir Создает новый подкаталог.
RemoveDir Удаляет подкаталог.
SetCurDir Изменяет текущий каталог.
─────────────────────────────────────────────────────────────────
Функции работы с каталогами
─────────────────────────────────────────────────────────────────
GetCurDir Возвращает текущий каталог на заданном диске
─────────────────────────────────────────────────────────────────
Функции управления операционной средой
─────────────────────────────────────────────────────────────────
Функция Описание
─────────────────────────────────────────────────────────────────
GetArgCount Возвращает число параметров, переданных
программе в командной строке.
GetArgStr Возвращает заданную строку операционной
среды.
GetEnvVar Возвращает указатель на значение заданной
переменной операционной среды.
─────────────────────────────────────────────────────────────────
Прочие процедуры
─────────────────────────────────────────────────────────────────
Процедура Описание
─────────────────────────────────────────────────────────────────
GetCBreak Возвращает проверяемое DOS состояние
Ctrl+Break.
SetCBreak Устанавливает проверяемое DOS состояние
Ctrl+Break.
GetVerify Возвращает состояние флага проверки в DOS.
SetVerify Устанавливает состояние флага проверки в
DOS.
─────────────────────────────────────────────────────────────────
Прочие функции
─────────────────────────────────────────────────────────────────
Функция Описание
─────────────────────────────────────────────────────────────────
DosVersion Возвращает номер версии операционной
системы DOS.
─────────────────────────────────────────────────────────────────