ОБРАЩЕНИЕ К ФУНКЦИЯМ ОПЕРАЦИОННОЙ СИСТЕМЫ

Содержание

Слайд 2

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

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

инициация программного прерывания.
Слайд 3

ПРЕРЫВАНИЕ - ЭТО ОСОБОЕ СОСТОЯНИЕ ВЫЧИСЛИТЕЛЬНОГО ПРОЦЕССА. В момент прерывания нарушается

ПРЕРЫВАНИЕ - ЭТО ОСОБОЕ СОСТОЯНИЕ ВЫЧИСЛИТЕЛЬНОГО ПРОЦЕССА.

В момент прерывания нарушается нормальный

порядок выполнения команд программы, и управление передается специальной процедуре, которая входит в состав MS DOS и называется процедурой обработки прерывания.
Каждое прерывание характеризуется в рамках MS DOS порядковым номером и связано со своей процедурой обработки.
В архитектуре центрального процессора ЭВМ предусмотрены прерывания двух типов: аппаратные и программные.
Аппаратные прерывания создаются схемами контроля и управления ЭВМ и сигнализируют операционной системе о переходе какого-либо устройства в новое состояние или о возникновении неисправности.
Слайд 4

Прерывания MS-DOS. Всего в MS DOS имеется около 40 программных прерываний.

Прерывания MS-DOS.

Всего в MS DOS имеется около 40 программных прерываний.

каждое из

которых может активизировать одну или несколько функций MS DOS.

Одно из прерываний - с номером 33 ($21) обеспечивает доступ к 85 функциям.

а всего в MS DOS имеется более 200 разнообразных функций.

Слайд 5

Модуль Dos Модуль Dos содержит ряд подпрограмм для работы с файлами

Модуль Dos

Модуль Dos содержит ряд подпрограмм для работы с файлами и

доступа к средствам операционной системы.
Ни одна из программ модуля Dos не определена в стандартном Паскале, поэтому они помещены в отдельный модуль.
Слайд 6

Процедуры и функции модуля Dos. Модуль DOS Функции управления операционной средой.

Процедуры и функции модуля Dos.

Модуль DOS
Функции управления операционной средой.
Процедуры управления процессами.
Процедуры

обслуживания прерываний.
Процедуры работы с датой и временем.
Процедуры и функции проверки состояния диска.
Процедуры и функции работы с файлами.
Процедуры и функции различного назначения.
Слайд 7

Функции управления операционной средой. Программа, написанная на языке Турбо Паскаль 7.0,

Функции управления операционной средой.

Программа, написанная на языке Турбо Паскаль 7.0, имеет

возможность получать от MS-DOS информацию об окружении (environment).
Каждое описание в области окружения представляет собой строку вида: Имя = Значение.
Имя — это имя переменной, Значение — текстовая строка.
Переменные окружения предназначены для хранения определенной системной информации, которая необходима различным прикладным программам, использующим ее в своих целях.
Слайд 8

В Турбо Паскале имеется три функции для работы с переменными окружения:

В Турбо Паскале имеется три функции для работы с переменными окружения:
FUNCTION

EnvCount : INTEGER;
FUNCTION EnvStr(index:INTEGER) : STRING;
FUNCTION GetEnv(EnWar: STRING) : STRING;
Слайд 9

Функции управления операционной средой. Функция EnvCount не имеет параметров и возвращает

Функции управления операционной средой.

Функция EnvCount

не имеет параметров и возвращает общее

число переменных окружения.

Функция EnvStr

имеет один параметр и возвращает строку, содержащую имя и значение переменной, которая соответствует значению указанного индекса.
индекс самой первой переменной — 1.
если указанный индекс меньше 1 или больше EnvCount, функция EnvStr возвращает пустую строку.

Слайд 10

Пример. {Использование функций EnvCount и EnvStr} USES Dos; VAR I: INTEGER;

Пример.

{Использование функций EnvCount и EnvStr}
USES Dos;
VAR
I: INTEGER;
BEGIN
FOR I := 1 TO

EnvCount DO WriteLn(i,' ',EnvStr(I));
ReadLn;
END.

Результат работы данной программы может выглядеть примерно следующим образом:

COMSPEC=C:\COMMAND.СОМ
РАТН=С:\NU;C:\;D:\TOOLS;C:\NC;C:\WINDOWS;
SYMANTEC=C:\SYMANTEC
NU=C:\NU

Слайд 11

Функции управления операционной средой. Функция GetEnv позволяет по имени переменной окружения

Функции управления операционной средой.

Функция GetEnv

позволяет по имени переменной окружения получить

ее значение.
при вызове функции указывается один параметр — имя переменной окружения.

Например, используя оператор WriteLn(GetEnv('PATH'))
можно получить на экране следующее:

С:\;С:\NC;\С:\ WINDOWS;D:\TOOLS;

Слайд 12

Процедуры управления процессами. Используя специальные средства языка Турбо Паскаль, можно организовать

Процедуры управления процессами.

Используя специальные средства языка Турбо Паскаль, можно организовать вызов

из программы любой другой программы, которую называют программой-потомком.

Важно помнить, что для того, чтобы программа-потомок успешно загрузилась в память и начала выполняться, необходимо обеспечить выделение ей требуемого объема памяти.

Так как программа, которая выполняется в данный момент, по умолчанию захватывает всю свободную динамическую память (кучу) системы, то для загрузки программы-потомка просто нет места.
Для того чтобы выделить для программы-потомка достаточное количество свободного места, необходимо в начале программы указать с помощью директивы компилятора $М минимальный размер выделяемой программе памяти, а если в программе не используется динамическая память, то вовсе не выделять ее.

Слайд 13

Директива {$M 16384,0,655360} устанавливается для программ по умолчанию. Здесь максимальный размер

Директива {$M 16384,0,655360} устанавливается для программ по умолчанию.
Здесь максимальный размер

кучи равен всей доступной памяти.
Поэтому вызов программы-потомка невозможен.
Но можно задать и такую директиву {$М 1024,0,0}.
В этом случае динамическая память вообще не выделяется.
Теперь можно вызывать программу-потомка.
Слайд 14

Процедуры управления процессами. Вызов программы-потомка производится с помощью процедуры: Exec(Path,CmdLine :

Процедуры управления процессами.

Вызов программы-потомка производится с помощью процедуры:
Exec(Path,CmdLine : STRING);

Path —

это полный или сокращенный путь к исполняемому файлу и его имя
CmdLine — параметр, в котором можно передать вызываемой программе командную строку.

Если вызов программы не произошел, то это никак не отразится на работе вызвавшей программы, т.е. она будет вести себя одинаково как при успешном, так и при неудачном вызове.

Слайд 15

Для того чтобы определить, как прошел вызов, используется системная переменная DosError.

Для того чтобы определить, как прошел вызов, используется системная переменная DosError.


Сразу после вызова процедуры Exec необходимо проверить значение переменной DosError.
Если она равна 0, то это значит, что вызов прошел успешно.
Ненулевое значение свидетельствует об ошибке.
Слайд 16

Процедуры управления процессами. Значения переменной DosError соответствуют кодам, вырабатываемым операционной системой, и могут быть следующими :

Процедуры управления процессами.

Значения переменной DosError соответствуют кодам, вырабатываемым операционной системой, и

могут быть следующими :
Слайд 17

Перед вызовом программы-потомка нужно восстановить исходные адреса обработчиков прерываний. А после

Перед вызовом программы-потомка нужно восстановить исходные адреса обработчиков прерываний.
А после завершения

работы вызываемой программы установить адреса обработчиков Турбо Паскаля.
Слайд 18

Процедуры управления процессами. Cпецифические особенности исполнения Турбо-Паскалевых программ требуют изменения стандартных

Процедуры управления процессами.

Cпецифические особенности исполнения Турбо-Паскалевых программ требуют изменения стандартных значений

некоторых векторов прерываний.

К ним относятся векторы со следующими шестнадцатеричными номерами:

$00, $02, $18, $23, $24, $34, $35,
$36, $37, $38, $39, $3А, $3В, 3С,
$3D, $3Е, $3F, $75.

Начальные значения этих векторов сохраняются в восемнадцати переменных с именами SaveIntXX ,
где ХХ - шестнадцатеричный номер прерывания.

Слайд 19

Непосредственно перед запуском внешней программы и сразу после возврата из нее

Непосредственно перед запуском внешней программы и сразу после возврата из нее

рекомендуется вызвать библиотечную процедуру не имеющая параметров SwapVectors, которая обменивает содержимое векторов прерывания и перечисленных переменных.
Слайд 20

Пример использования процедур Exec и SwapVectors . {Использование процедур Exec и

Пример использования процедур Exec и SwapVectors .

{Использование процедур Exec и SwapVectors}
{$М

1024,0,0} {освобождение памяти для потомка}
USES Dos;
VAR
ProgName, CmdLine: STRING;
BEGIN
Write('Введите путь и имя исполняемого файла ');
ReadLn(ProgName);
Write('Введите командную строку ');
ReadLn(CmdLine);
SwapVectors; {переустановка векторов}
Exec(ProgName, CmdLine);
SwapVectors; {восстановление векторов}
IF DosError <> 0 {проверка на ошибку запуска}
THEN
WriteLn('Ошибка DOS ', DosError)
ELSE
WriteLn('Выполнено успешно, код возврата ',Lo(DosExitCode));
END.
Слайд 21

Процедуры управления процессами. Функция DosExitCode : WORD; Эта функция возвращает значение

Процедуры управления процессами.

Функция DosExitCode : WORD;

Эта функция возвращает значение типа WORD,

в младшем байте которого содержится код возврата, переданный через процедуру завершения, а в старшем — признак того, как завершилась программа (см. табл.).
Слайд 22

Процедуры управления процессами. В заключение рассмотрим еще один весьма полезный пример.

Процедуры управления процессами.

В заключение рассмотрим еще один весьма полезный пример.
Программа

воспринимает с клавиатуры любую команду DOS, затем вызывает командный процессор СОММАND.СОМ операционной системы и передает ему эту команду.

PROGRAM ExecDemo;
{$M 1024, 0, 0}
Uses DOS;
var
st: string f79];
BEGIN
write ( ‘Введите команду DOS:’ );
read1n (st);
if st <> '' then
begin
st := '/C '+st,;
SwapVectors;
Exec (GetEnv ('COMSPEC'), st);
SwapVectors
end;
END.

Слайд 23

Обратите внимание: для указания файла СОММАND.СОМ и пути к нему используется

Обратите внимание: для указания файла СОММАND.СОМ и пути к нему используется

обращение к библиотечной функции GetEnv, с помощью которой можно получить параметры настройки операционной системы.
В частности, параметр СОМSPЕС определяет спецификацию файла, содержащего командный процессор.
Слайд 24

Процедуры обслуживания прерываний. Несмотря на то, что Турбо Паскаль имеет большой

Процедуры обслуживания прерываний.

Несмотря на то, что Турбо Паскаль имеет большой набор

инструментальных средств для использования возможностей MS-DOS, во многих случаях возникает необходимость прямого обращения к функциям MS-DOS для использования некоторых специфических средств операционной системы, в частности, для организации обмена информацией в оперативной памяти.
Рассмотрим более подробно принцип такого обмена.
Слайд 25

Для более полного использования возможностей MS-DOS в модуле Dos имеются две процедуры: Intr и MsDos.

Для более полного использования возможностей MS-DOS в модуле Dos имеются две

процедуры:
Intr и MsDos.
Слайд 26

Процедуры обслуживания прерываний. Процедура Intr(IntNo :BYTE; VAR Regs :REGISTERS) выполняет заданное

Процедуры обслуживания прерываний.

Процедура
Intr(IntNo :BYTE; VAR Regs :REGISTERS)
выполняет заданное программное

прерывание.

IntNo — номер программного прерывания;
REGISTERS — является типом записи, определенным в модуле Dos следующим образом:

Type Registers = Record
Case Integer Of
0: (AX, BX, CX, DX, BP, SI, DI, DS, ES, Flags : Word);
1: (AL, AH, BL, BH, CL, CH, DL, DH : Byte);
End;

Поля записи соответствуют регистрам процессора.

Слайд 27

Процесс выполнения процедуры Intr. Таким образом, можно получить доступ к результатам работы процедуры прерывания

Процесс выполнения процедуры Intr.

Таким образом, можно получить доступ к результатам работы

процедуры прерывания
Слайд 28

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

Процедуры обслуживания прерываний.

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

следующие константы масок
Слайд 29

Пример использования процедуры Intr. прерывание с номером 18 ($12) возвращает в

Пример использования процедуры Intr.

прерывание с номером 18 ($12) возвращает в регистре

AX объем оперативной памяти ЭВМ

PROGRAM IntrDem; {Использование процедуры Intr}
Uses DOS;
Var
r : registers;
BEGIN
Intr ($12, r);
writeln('Объем памяти = ', r.АХ, ' Кбайт')
END.

Слайд 30

Прерывание номер 33 ($21) стоит особняком и называется прерывание DOS. Оно

Прерывание номер 33 ($21) стоит особняком и называется прерывание DOS.
Оно

дает доступ к большому количеству функций различных функций DOS
(этим прерыванием вызывается 85 функций).
Слайд 31

Процедуры обслуживания прерываний. Процедура MsDos(VAR Regs:REGISTERS) выполняет вызов функции DOS. Результат

Процедуры обслуживания прерываний.

Процедура
MsDos(VAR Regs:REGISTERS)
выполняет вызов функции DOS.

Результат обращения к

процедуре MsDos будет тот же, что и при обращении к процедуре Intr с номером прерывания $21.
Слайд 32

Пример использования процедуры MsDos. PROGRAM MsDosDemo; Uses DOS; Var R: registers;

Пример использования процедуры MsDos.

PROGRAM MsDosDemo;
Uses DOS;
Var
R: registers;
BEGIN
r.AH: = $30;
MsDos (r);
WriteLN ('Версия

операционной системы :’,r.АL,'.',r.АН)
END.
Слайд 33

Процедуры обслуживания прерываний. Довольно распространенной является ситуация, когда в программе необходимо

Процедуры обслуживания прерываний.

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

собственные алгоритмы реакции на прерывания операционной системы.

При этом обычно нужно либо отменить стандартные реакции, либо сделать так, чтобы выполнялась и стандартная реакция, и своя собственная.

Для этого Турбо Паскаль позволяет создавать процедуры специального вида —
обработчики прерываний

хотя обычно такие процедуры пишутся на языке ассемблера

Слайд 34

Обработчики прерываний. Заголовок таких процедур должен иметь стандартный вид: PROCEDURE имя_процедуры

Обработчики прерываний.

Заголовок таких процедур должен иметь стандартный вид:

PROCEDURE имя_процедуры (Flags,CS,IP,АХ,ВХ,СХ,DX,SI,DI,DS,ES,BP:WORD);
INTERRUPT;
begin
.

. . . . . .
end;

При активизации процедуры обработки прерываний в стек автоматически сохраняется содержимое всех регистров,
а процедуре передаются копии содержимого тех регистров, которые указаны к качестве формальных параметров.
Поэтому в процедуре их можно изменять и использовать.

Слайд 35

Порядок следования параметров должен точно соответствовать приведенному выше, но допускается указывать только необходимые из них.

Порядок следования параметров должен точно соответствовать приведенному выше,
но допускается указывать

только необходимые из них.
Слайд 36

Процедуры обслуживания прерываний. При написании процедур обработки прерываний существенными являются следующие

Процедуры обслуживания прерываний.

При написании процедур обработки прерываний существенными являются следующие обстоятельства:

Процедура

обработки прерывания не должна искажать работу прерванной программы.

Для этого необходимо сначала сохранить регистры центрального процессора, а перед выходом из процедуры — восстановить их.

Процедура должна строиться по принципу реентерабельности (повторной входимости)

Ее работа может быть прервана в любой момент другими прерываниями и DOS может обратиться к соответствующей функции до завершения обработки предыдущего прерывания.

В самой процедуре обработки прерывания не рекомендуется обращение к другим функциям DOS.

Так как некоторые из них, в том числе все функции ввода-вывода, нереентерабельны.

Слайд 37

Процедуры обслуживания прерываний. Процедура SetIntVec(IntNo :BYTE; Vector :POINTER); используется для установки

Процедуры обслуживания прерываний.

Процедура
SetIntVec(IntNo :BYTE; Vector :POINTER);
используется для установки нового

адреса обработчика прерывания .

IntNo — номер прерывания, которое необходимо переопределить;
Vector — адрес новой процедуры обработки прерывания.

Слайд 38

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

Процедуры обслуживания прерываний.

Для того чтобы изменить реакцию системы на прерывание и

определить пользовательский обработчик, SetIntVec просто изменяет запись в системной области DOS, которая называется областью векторов прерываний.

но при этом старый вектор, т.е. адрес старой процедуры обработки прерываний, не сохраняется.

Адрес старой процедуры обработки прерываний может быть необходим, чтобы через некоторое время восстановить старую реакцию на прерывание.

или чтобы при вызове прерывания сначала срабатывал новый обработчик, который затем передавал бы управление оригинальному (старому) обработчику.

Слайд 39

Процедуры обслуживания прерываний. Этот принцип использует большинство резидентных программ. Таким образом,

Процедуры обслуживания прерываний.

Этот принцип использует большинство резидентных программ.

Таким образом, работоспособность системы

не нарушается, когда несколько программ перехватывают одно прерывание.

Резидентная программа сначала отрабатывает сама, затем передает управление другой программе и так далее, а в конце управление передается операционной системе. .

Слайд 40

Поэтому очень важно сохранить адрес cтарого обработчика прерывания. Для этого можно

Поэтому очень важно сохранить адрес cтарого обработчика прерывания.
Для этого можно использовать

процедуру
GetlntVec(IntNo :BYTE; VAR Vector :POINTER);
которая присваивает параметру-переменной Vector адрес текущего обработчика прерывания, номер которого задан в параметре IntNo.
Слайд 41

Процедуры обслуживания прерываний. Следующий пример выводит на экран содержимое всех ненулевых

Процедуры обслуживания прерываний.

Следующий пример выводит на экран содержимое всех ненулевых векторов

прерываний.

Uses DOS;
var
i : byte;
p : pointer;
BEGIN
for i := 0 to 255 do
begin
GetIntVec (i, p);
if (Seg (p^) <> 0) or (Ofs (p^) <> 0) then
write1n (' N =', i:3, ' Seg =', Seg (p^):5, Ofs =', Ofs (p^):5)
end
END.

Слайд 42

Программы, резидентные в памяти. Существует еще одна процедура, относящаяся к процедурам

Программы, резидентные в памяти.

Существует еще одна процедура, относящаяся к процедурам управления

процессами - это процедура Keep.
Keep(ExitCode: WORD);
Вызов этой процедуры приводит к завершению работы программы, но при этом оставляет ее в памяти.
Такие программы носят название программ, резидентных в памяти (Terminate and Stay Resident, TSR), или просто резидентных программ.
На этом принципе построены драйверы устройств и различные сервисные программы, например резидентные словари или калькуляторы.
Слайд 43

Программы, резидентные в памяти. После того как программа осталась резидентной в

Программы, резидентные в памяти.

После того как программа осталась резидентной в памяти,

она передает управление командному процессору.

а сама как бы «замирает».

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

например, прерывание от клавиатуры.

После нажатия нужной комбинации клавиш программа перехватывает управление и выполняет свою задачу.

Слайд 44

Пример резидентной программы. Переопределим прерывание от клавиатуры. USES Dos; CONST Segment

Пример резидентной программы.

Переопределим прерывание от клавиатуры.

USES Dos;
CONST
Segment = $B800;
Col =

39;
Row = 12;
Attr = $0C;
VAR
Offset : WORD;
Vector : PROCEDURE;
Activ : BOOLEAN;
{$F+} {должен использоваться дальний тип вызова}
Слайд 45

Пример резидентной программы. PROCEDURE Int09; INTERRUPT; {процедура обработки прерывания 09} VAR

Пример резидентной программы.

PROCEDURE Int09; INTERRUPT; {процедура обработки прерывания 09}
VAR
Time62, Time60, Portfo :

BYTE;
BEGIN
Time60:=Port[$60); {чтение регистров портов}
Portfo:=Port[$61];
Time62:=Port[$62];
Port[$61]:=Portfo OR 128; {запись новых значений в регистры порта}
Port[$61]:=Portfo AND 127;
IF ((Mem[$40:$17]=Mem[$40:$17] OR 12) AND (Time60=19)) OR (activ) THEN
BEGIN
Activ:=TRUE;
IF Time60=l THEN Activ:=FALSE;
Mem[Segment:Offset+1]:=Attr; {прямой вывод в видеопамять}
Mem[Segment:Off3et+3]:=Attr;
Mem[Segment:Offset+5]:=Attr;
Mem[Segment:Offset]:=(Time60 DIV 100J+48;
Mem[Segment:0ffset+2]:=((Time60 MOD 100) DIV 10)+48;
Mem[Segment:Offset+4]:=((Time60 MOD 100) MOD 10)+48;
END;
INLINE ($9С); {вызов новой процедуры обработки прерывания}
Vector;
End;
Слайд 46

Пример резидентной программы. {$F-} BEGIN Activ:=FALSE; Offset:=(Row-l)*160+(Col-l) SHL 1; GetIntVec($09,@Vector) ;

Пример резидентной программы.

{$F-}
BEGIN
Activ:=FALSE;
Offset:=(Row-l)*160+(Col-l) SHL 1;
GetIntVec($09,@Vector) ; {сохранение старого вектора}
SetIntVec($09,Addr(Int09));

{установка нового вектора}
Keep(0); {выйти и остаться резидентной}
END.

Данная программа остается резидентной в памяти и выводит на экран значение скэн-кодов нажатых клавиш.

Процедура Int09 перехватывает прерывание клавиатуры и активизируется после нажатия комбинации клавиш [Ctrl+Alt+R], а затем используя прямой доступ к видеопамяти, выводит скэн-коды

После нажатия клавиши [Esc] вывод кодов прекращается.

Слайд 47

Резидентные программы лучше писать с использованием языка низкого уровня.

Резидентные программы лучше писать с использованием языка низкого уровня.

Слайд 48

Процедуры работы с датой и временем. Модуль Dos предоставляет программисту возможность

Процедуры работы с датой и временем.

Модуль Dos предоставляет программисту возможность доступа

к системным часам и календарю, а также дает возможность изменять дату и время создания файла.
Для доступа к системной дате используют процедуры GetDate и SetDate.
Для доступа к системным часам используются процедуры SetTime и GetTime.
Слайд 49

Процедуры работы с датой и временем. Процедура GetDate GetDate(var year,month,day,day_of_week :

Процедуры работы с датой и временем.

Процедура GetDate

GetDate(var year,month,day,day_of_week : WORD);


возвращает текущую дату, установленную в системе.

Процедура SetDate

SetDate(year,month,day : WORD);
устанавливает текущую дату в операционной системе.

Слайд 50

Процедуры работы с датой и временем. Значения параметров year может принимать

Процедуры работы с датой и временем.

Значения параметров

year

может принимать значения от 1980

до 2099

month

значения от 1 до 12

day

значения от 1 до 31

day_of_week

значения от 0 до 6,
где 0 означает воскресенье.

Слайд 51

Пример программы, демонстрирующий использование процедур GetDate и SetDate. USES Dos; CONST

Пример программы, демонстрирующий использование процедур GetDate и SetDate.

USES Dos;
CONST
days : ARRAY[0..6]

OF STRING[11] =('Воскресенье','Понедельник','Вторник',
'Среда', 'Четверг' , 'Пятница', 'Суббота');
VAR
year,month,day,day_of_week : WORD;
PROCEDURE Get_Date;
BEGIN
GetDate(year,month, day,day_of_week);
WriteLn('Сегодня ',days[day_of_week], ‘, ',day,'/',month,’/', year) ;
END;
PROCEDURE Set_Date;
BEGIN
Write('Введите число, месяц и год, используя пробел в качестве разделителя’);
ReadLn(day,month,year); SetDate(year,month,day);
END;
Слайд 52

Пример программы, демонстрирующий использование процедур GetDate и SetDate. BEGIN Get_Date; {получение

Пример программы, демонстрирующий использование процедур GetDate и SetDate.

BEGIN
Get_Date; {получение текущей даты}
Set_Date; {установка

новой даты}
END.

Данная программа представляет собой аналог команды DOS DATE.

Если параметры в процедуре SetDate будут заданы некорректно, то вызов процедуры будет проигнорирован и дата не изменится.

Слайд 53

Процедуры работы с датой и временем. Процедура GetTime GetTime (var hour,

Процедуры работы с датой и временем.

Процедура GetTime

GetTime (var hour, minute,

second, hund: WORD);
возвращает текущее время, установленное в системе.

Процедура SetTime

SetTime (hour, minute, second, hund: WORD);
устанавливает текущее время в операционной системе.

Слайд 54

Процедуры работы с датой и временем. Значения параметров hour может принимать

Процедуры работы с датой и временем.

Значения параметров

hour

может принимать значения от 0

до 23

minute

значения от 0 до 59

second

значения от 0 до 59

hund

значения от 0 до 99,
сотые доли секунды

Слайд 55

Пример программы, демонстрирующий использование процедур GetTime и SetTime. USES Dos; VAR

Пример программы, демонстрирующий использование процедур GetTime и SetTime.

USES Dos;
VAR
hour,minute,second,hund : WORD;
PROCEDURE

Get_Time;
BEGIN
GetTime(hour, minute,second,hund);
WriteLn('Текущее время',hour,':',minute,':',second,':',hund’);
END;
PROCEDURE Set_Time;
BEGIN
Write('Введите часы, минуты и секунды');
ReadLn(hour, minute, second);
SetTime(hour,minute,second,0);
END;
BEGIN
Get_Time; {получение текущего времени}
Set_Time; {установка нового времени}
END.
Слайд 56

Процедуры работы с датой и временем. Процедура GetFTime GetFTime(var F; var

Процедуры работы с датой и временем.

Процедура GetFTime

GetFTime(var F; var Time:Longlnt);
возвращает

время и дату создания файла.

Переменная F должна быть файловой переменной.

Время и дата возвращаются в переменной Time в упакованном формате в виде двойного слова (32 бита)

для их распаковки используется процедура UnpackTime

Слайд 57

Процедуры работы с датой и временем. Процедура UnpackTime UnpackTime(Time: Longlnt; VAR

Процедуры работы с датой и временем.

Процедура UnpackTime

UnpackTime(Time: Longlnt; VAR DT:

DateTime);
преобразовывает значение, переданное в параметре Time, в запись DT типа DateTime (дата и время).

Тип DateTime описан в модуле Dos следующим образом:

TYPE
DataTime = RECORD
Year, Month, Day, Hour, Min, Sec : WORD;
END;

Слайд 58

Процедуры работы с датой и временем. Процедура SetFTime SetFTime(VAR F; Time:

Процедуры работы с датой и временем.

Процедура SetFTime

SetFTime(VAR F; Time: Longlnt);
устанавливает время

и дату создания файла.

Процедура PackTime

PackTime(VAR T: DateTime; VAR Time: Longlnt);
преобразовывает запись типа DateTime в двойное слово, используемое процедурой SetFTime.

Слайд 59

О том, как прошла операция установки даты создания файла, можно узнать

О том, как прошла операция установки даты создания файла, можно узнать

из переменной DosError.
В случае успешного завершения переменная DosError будет содержать 0.
В случае неудачи код ошибки может быть только 6 (разрушен заголовок файла).
Слайд 60

Следует запомнить, что файл, для которого необходимо изменить дату создания, должен

Следует запомнить, что файл, для которого необходимо изменить дату создания, должен

быть открыт для чтения.
Если файл открыт процедурой Rewrite, то после того, как дата его создания изменена и в конце работы файл будет закрыт процедурой Close, дата создания автоматически обновится, т. е. установится текущая системная дата.
Поэтому, если происходит запись в файл, а затем требуется изменить дату его создания, можно просто выполнить перед процедурой SetFTime команду Reset, т.е. открыть файл для чтения.
Слайд 61

Пример программы, использующей процедуры работы с временем создания файла. USES Dos;

Пример программы, использующей процедуры работы с временем создания файла.

USES Dos;
VAR
ff : TEXT;
hour,

minute, second, hund : WORD; {переменные для GetTime}
FileTime : LongInt; {переменная для GetFTime и SetFTime}
dt : DateTime; {переменная для PackTime и UnpackTime}
FUNCTION FZero(w : WORD) :STRING;
VAR
S : STRING;
BEGIN
Str(w:0, S);
IF Length(S) = 1 THEN S:= '0' + S;
FZero:= S ;
END;
Слайд 62

Пример программы, использующей процедуры работы с временем создания файла. BEGIN Assign(ff,

Пример программы, использующей процедуры работы с временем создания файла.

BEGIN
Assign(ff, Paramstr(1));
GetTime(hour, minute,second,hund);


WriteLn('Текущее время',FZero(hour),':',FZero(minute),':‘,FZero(second));
Rewrite(ff); {создание нового файла}
GetFTime(ff,filetime); {получение времени создания}
UnpackTime(filetime, dt);
WITH dt DO
BEGIN
WriteLn('Файл создан ', FZero(hour),':',FZero(min),':',FZero(sec));
hour:= 13;
min:= 0;
sec:= 0;
year:=2009;
month:=4;
day:=2;
PackTime(dt, FileTime) ;
WriteLn('Устанавливаем время создания 13:00 2 апреля 2009 г.');
Reset (ff); {Открытие файла для чтения}
SetFTime(ff,FileTime);
END;
Close(ff); {Закрытие файла}
END.
Слайд 63

Процедуры и функции проверки состояния диска. Модуль Dos содержит ряд функций

Процедуры и функции проверки состояния диска.

Модуль Dos содержит ряд функций и

процедур для работы с диском.
С их помощью можно осуществлять контроль за наличием свободного пространства на диске, контроль правильности записи на диск, а также определять общий объем памяти диска.
Слайд 64

Процедуры и функции проверки состояния диска. Функция DiskFree DiskFree( Drive: BYTE)

Процедуры и функции проверки состояния диска.

Функция DiskFree

DiskFree( Drive: BYTE) :Longlnt;
возвращает

количество свободных байтов на указанном диске.

Drive — задает номер диска:

и так далее …..

Слайд 65

Если номер диска задан некорректно, то функция DiskFree возвращает значение 1.

Если номер диска задан некорректно, то функция DiskFree возвращает значение 1.
Таким

образом, всегда есть возможность проконтролировать правильность вызова функции.
Слайд 66

Процедуры и функции проверки состояния диска. Функция DiskSize DiskSize( Drive: BYTE)

Процедуры и функции проверки состояния диска.

Функция DiskSize

DiskSize( Drive: BYTE) :Longlnt;
возвращает

общее количество байтов на указанном диске.

Drive — задает номер диска:

и так далее …..

Слайд 67

Процедуры и функции проверки состояния диска. {Использование функций DiskFree и DiskSize}

Процедуры и функции проверки состояния диска.

{Использование функций DiskFree и DiskSize}
USES

Dos;
BEGIN
WriteLn('Объем вашего диска ', DiskSize(0) DIV 1024,' Kb');
WriteIn('Ha диске свободно ', DiskFree(0) DIV 1024,' Kb');
END.
Слайд 68

Процедуры и функции проверки состояния диска. Процедура GetVerify GetVerify( var Verify:

Процедуры и функции проверки состояния диска.

Процедура GetVerify

GetVerify( var Verify: BOOLEAN);
используется

для получения значения флага проверки DOS.

Если VERIFY находится во включенном состоянии, т.е. равен ON (истина), то после того, как информация записана на диск, она снова читается и сверяется с оригиналом.
Если же флаг находится в выключенном состоянии, т.е. OFF (ложь), то информация записывается на диск без проверки.

Процедура SetVerify

SetVerify( Verify: BOOLEAN);
устанавливает или отменяет флаг проверки в зависимости от параметра значения параметра Verify.

Слайд 69

Процедуры и функции проверки состояния диска. {Контроль флага VERIFY} USES Dos;

Процедуры и функции проверки состояния диска.

{Контроль флага VERIFY}
USES Dos;
VAR
f : BOOLEAN;
OffOn

: STRING[14];
BEGIN
GetVerify(f);
If f Then OffOn := 'ON - включен'
ELSE OffOn := 'OFF - выключен'
WriteLn('Флаг проверки ', OffOn);
f := Not(f);
WriteLn(Переключаем флаг проверки');
SetVerify(f);
END.

Данная программа получает флаг проверки и изменяет его значение на противоположное.

Слайд 70

Процедуры и функции работы с файлами. Работа с файлами в Турбо

Процедуры и функции работы с файлами.

Работа с файлами в Турбо Паскале

приводит к необходимости использования терминологии и средств MS-DOS.
Иногда возникает необходимость поиска файлов с одинаковым именем, поиска по шаблону, выделения нужного файла из найденной группы файлов.
Процедуры FSplit, FExpand, FSearch, FindFirst, FindNext упрощают решение этих задач.
Слайд 71

Процедуры и функции работы с файлами. Для работы с файлами в

Процедуры и функции работы с файлами.

Для работы с файлами в модуле

Dos определены следующие процедуры и функции :
Слайд 72

Процедуры и функции работы с файлами. Процедура FindFirst FindFirst(Path :STRING; Attr

Процедуры и функции работы с файлами.

Процедура FindFirst

FindFirst(Path :STRING; Attr :WORD;

VAR S :SearchRec);
Поиск первого файла с заданным именем и атрибутами в указанном каталоге.

Path — путь и имя для поиска;
Attr — задаваемые атрибуты файла;
S — переменная типа SearchRec.

Процедура FindNext

FindNext( VAR S :SearchRec);
Поиск следующего файла с заданным именем в указанном каталоге.

Слайд 73

Тип SearchRec описан в модуле Dos следующим образом: Поле Attr содержит

Тип SearchRec описан в модуле Dos следующим образом:

Поле Attr содержит атрибуты

файла, которые определяются константами атрибутов файла, описанными в модуле Dos (см. таблицу).
Поле Time содержит дату и время создания файла в упакованном виде (для распаковки необходимо использовать процедуру UnpackTime).
Поле Size содержит размер файла в байтах.
Поле Name содержит имя найденного файла.
Поле Fill содержит служебную информацию MS-DOS и не должно модифицироваться.

TYPE
SearchRec = RECORD
Fill : ARRAY[1..21] OF BYTE;
Attr : BYTE;
Time : Longlnt;
Size : Longlnt;
Name : STRING[12];
END;

Слайд 74

Процедура FindNext ищет следующий файл с именем и атрибутами, заданными при

Процедура FindNext ищет следующий файл с именем и атрибутами, заданными при

вызове FindFirst, если имя файла было задано шаблоном.
Если FindNext не находит больше файлов, в системной переменной DosError устанавливается значение 18.
Слайд 75

Пример, демонстрирующий использование процедур поиска файлов. USES Dos; VAR DT :

Пример, демонстрирующий использование процедур поиска файлов.

USES Dos;
VAR
DT : DateTime;
S : SearchRec;
Function FZero(d

: WORD) : STRING;
var t : STRING;
Begin
Str(d:0,t);
IF Length(t)=1 THEN t:='0'+t;
FZero:=t;
End;
BEGIN
WriteLn;
FindFirst ('*.exe ', AnyFile, S);
While DosError=0 Do
begin
UnpackTime( S.Time, DT);
Write(S.Name, ' ',FZero (DT.Hour),':',FZero(DT.Min),':',FZero(DT.Sec));
WriteLn (' ',FZero(DT.Day),':',FZero(DT.Month),':', DT.Year);
FindNext(S);
end;
ReadLN
END.
Слайд 76

Процедуры и функции работы с файлами. Функция FSearch FSearch(Path : PathStr;

Процедуры и функции работы с файлами.

Функция FSearch

FSearch(Path : PathStr; DirList :

STRING) : PathStr;
Поиск файла в списке каталогов.

Path — путь и имя файла, который необходимо найти;
Dirlist — это список каталогов, в которых будет проводиться поиск;
Тип PathStr описан в модуле Dos, как строковый тип STRING[79].

Каталоги в списке должны быть разделены точкой с запятой.

аналогично тому, как это делается в команде MS-DOS PATH.

Поиск всегда начинается с текущего каталога текущего диска.

В случае удачного поиска функция возвращает строку, в которой содержится полное имя файла (путь и имя).
В случае неудачи возвращается пустая строка.

Слайд 77

Использование процедуры FSearch. USES Dos; VAR F : PathStr; BEGIN F:=FSearch('NDD.EXE',GetEnv(‘PATH'));

Использование процедуры FSearch.

USES Dos;
VAR
F : PathStr;
BEGIN
F:=FSearch('NDD.EXE',GetEnv(‘PATH'));
{используется системная переменная PATH

для поиска}
IF F = ' ' THEN WriteLn('Файл NDD.EXE не найден')
ELSE WriteLn(‘найден как ',F);
ReadLn; {ожидание нажатия Enter}
END.

Для поиска применяется переменная окружения DOS PATH.
Поиск проводится в каталогах, перечисленных в этой переменной, но можно задать и свой список каталогов.

Слайд 78

Процедуры и функции работы с файлами. Процедура FSplit FSplit(Path : PathStr;

Процедуры и функции работы с файлами.

Процедура FSplit

FSplit(Path : PathStr; var

Dir : DirStr; var Name :Namestr; var ExtrExtStr);
позволяет разбить полный путь к файлу на три компонента.

Типы для работы с именами файлов определены в модуле Dos следующим образом:

ТУРЕ
ComStr = STRING[127];
PathStr = STRING[79];
DirStr = STRING[67];
NameStr = STRING[8];
ExtStr = STRING[4] ;

Слайд 79

Использование процедуры FSplit Uses Dos; Var Р: PathStr; D: DirStr; N:

Использование процедуры FSplit

Uses Dos;
Var
Р: PathStr;
D: DirStr;
N: NameStr;
E: ExtStr;
BEGIN
P:=FSearch('NDD.EXE',

GetEnv('PATH')); {поиск файла}
If P ='' Then WriteLn('NDD.EXE не найден')
Else
begin
WriteLn('найден как ', P);
FSplit( P, D, N, E) ; {разбиение на компоненты}
WriteLn('путь ',D );
WriteLn('имя ',N);
WriteLn('расширение ',Е);
end;
ReadLn; {ожидание нажатия Enter}
END.
Слайд 80

Использование процедур работы с атрибутами файлов. USES Dos; Var F :

Использование процедур работы с атрибутами файлов.

USES Dos;
Var
F : File;
FileName : PathStr;
Attr : WORD;
NewAttr : BYTE;
BEGIN
Write('Введите имя файла : ');

ReadLn(FileName);
Assign(F, FileName);
GetFAttr(F, Attr); {получение атрибутов файла}
IF DosError <> 0
THEN WriteLn('Ошибка DOS ', DosError)
ELSE
Begin
WriteLn('Файл ', FileName);
Write('Атрибуты файла = ', Attr,', '); {Определение атрибутов файла}
IF Attr AND Readonly <> 0 THEN Write('только для чтения; ');
IF Attr AND Hidden <> 0 THEN Write ('скрытый файл;');
IF Attr AND SysFile <> 0 THEN Write (' системный файл; ');
IF Attr AND VolumelD <> 0 THEN Write('метка тома; ');
IF Attr AND Directory <> 0 THEN Write('имя директории; ');
IF Attr AND Archive <> 0 THEN Write ('архивный файл); ');
WriteLn;
Слайд 81

Использование процедур работы с атрибутами файлов. WriteLn('Установка нового атрибута'); WriteLn('1- только

Использование процедур работы с атрибутами файлов.

WriteLn('Установка нового атрибута');
WriteLn('1- только для чтения,

2- скрытый файл,');
WriteLn('3- системный файл, 4- метка тома, ' );
WriteLn('5 - имя директории,6 - архивный');
Write ('Введите новый атрибут '); ReadLn (NewAttr);
{установка новых атрибутов}
CASE NewAttr OF
1: SetFAttr(F, Readonly);
2: SetFAttr(F, Hidden);
3: SetFAttr(F, SysFile);
4: SetFAttr(F, VolumelD);
5: SetFAttr(F, Directory);
ELSE SetFAttr(F, Archive);
end; { of Case }
End;
END.
Слайд 82

Другие процедуры и функции. В модуле Dos есть еще несколько процедур

Другие процедуры и функции.

В модуле Dos есть еще несколько процедур и

функций, не рассмотренных нами.
Это функция Dos-Version и процедуры GetCBreak и SetCBreak.
Слайд 83

Другие процедуры и функции. Функция DosVersion DosVersion : WORD; возвращает номер

Другие процедуры и функции.

Функция DosVersion

DosVersion : WORD;
возвращает номер версии DOS.

В

старшем байте содержится целая часть номера версии например 6, а в младшем байте — дробная часть номера, например 22.
В итоге получаем 6.22.
Слайд 84

Использование функции DosVersion. USES Dos; VAR V : WORD; BEGIN V

Использование функции DosVersion.

USES Dos;
VAR
V : WORD;
BEGIN
V := DosVersion;
WriteLn('Версия DOS ',

Lo(V), '.',Hi(V));
END.
Слайд 85

Другие процедуры и функции. Процедура GetCBreak GetCBreak(VAR BREAK: BOOLEAN); возвращает значение

Другие процедуры и функции.

Процедура GetCBreak

GetCBreak(VAR BREAK: BOOLEAN);
возвращает значение системной переменной

MS-DOS BREAK.

Процедура SetCBreak

SetCBreak(BREAK: BOOLEAN);
устанавливает системную переменную MS-DOS BREAK.

Если BREAK равна OFF, т.е. выключена, то прерывание программы осуществляется только во время операций ввода-вывода и выполнение программ происходит немного быстрее.
Если же BREAK равна ON, то прерывание происходит при любых системных вызовах.