12.10. Процедуры для работы с каталогами
Поскольку Турбо Паскаль ориентирован на работу в среде MS-DOS, естественно, что он содержит средства, специфичные именно для этой ОС. В частности, в системной библиотеке имеются процедуры для работы с каталогами на дисках. Эти процедуры (табл. 12.5 ) практически повторяют набор средств самой MS-DOS.
- 260 -
Таблица 12.5
Процедура
Назначение
GetDir(drive : Byte; VAR S : String)
Возвращает в строке S текущее имя каталога на диске с индексом drive
ChDir(S : String)
Устанавливает текущим каталог с именем, содержащимся в S
MkDir(S : String)
Создает каталог с именем S на диске
RmDir(S : String)
Удаляет пустой каталог с именем S с диска
Для работы с каталогами Турбо Паскаль использует вызовы функций MS-DOS, а они очень чувствительны ко входным значениям имен каталогов и (или) дисков. Поэтому при невозможности выполнения процедуры возникает ошибка времени счета, и программа аварийно останавливается. Этого, однако, не случится, если вызов процедуры будет откомпилирован в режиме {$I-} — программа не будет обрываться. Подробнее об этом см. в разд. 12.11 «Обработка ошибок ввода-вывода» (команды управления каталогами определены как часть библиотеки ввода-вывода).
Процедура GetDir( drive : Byte; VAR S : String ) может определить имя текущего каталога заданного диска. Диск задается его индексом или номером:
0 — текущий диск
1 — диск А:
2 — диск В:
3 — диск С:
и т.д.
Если задать номер диска, отсутствующего в конфигурации ПЭВМ, то возникнет ошибка. После выполнения процедуры переменная S будет содержать полное имя каталога (с указанием буквы диска). Можно использовать GetDir для получения текущей буквы диска:
GetDir( 0, S );
WriteLn( 'Текущий диск-> ', S[1], S[2] );
Возвращаемое в S значение можно потом без изменений использовать в вызовах ChDir и MkDir. Но если надо приписать к нему имя файла, то не забудьте вставить между ними разделитель '':
GetDir( 1, S );
FullFileName := S + '' + FileName;
Однако это не лучшее решение задачи, ибо как быть в случае, если
- 261 -
S содержит корневой каталог 'А:'? Решение может дать процедура FExpand модуля DOS.
Процедура ChDir( S : String ) используется для перехода в какой-либо существующий на диске каталог. Она делает текущим каталог, содержащийся в строке S (точнее, пытается сделать — все зависит от корректности содержимого S). Параметр S может содержать все те же значения, что может принять команда MS-DOS CD (CHDIR). Вот некоторые примеры вызовов:
ChDir('C:PASCALEXE') — задан весь путь;
ChDir('PASCALDOS') — дан путь от корневого каталога;
ChDir('WORK') — переход в подкаталог Work текущего каталога;
ChDir('..') — выход из подкаталога;
ChDir('..TOOLS') — то же, но с переходом;
ChDir('') — возврат в корневой каталог;
ChDir('A:') — переход в текущий каталог диска A:
Программа может сама создавать каталоги и подкаталоги, используя процедуру MkDir( S : String ). Параметр S должен содержать корректное имя нового подкаталога и при необходимости путь к нему (маршрут). Если возможно по правилам MS-DOS создать такой каталог, то он будет создан. Перехода в новый каталог при этом не происходит. Примеры обращений к процедуре:
MkDir( 'C:PASCALNEW');
MkDir( 'HOBBY');
MkDir( '..NEWDIR');
Каталоги можно удалять. Удалить можно любой каталог, если:
1) он совершенно пуст;
2) он не является текущим.
Удаление производится процедурой RmDir( S : String ), где S содержит имя удаляемого каталога. Удаление — процедура, симметричная созданию каталога. Примеры будут аналогичны примерам для процедуры MkDir.
Описанными выше процедурами вовсе не исчерпывается набор средств для работы со структурой дисков. Большое число специальных функций реализовано в модуле DOS и рассматривается в гл. 16.