Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
TURBO_PASCAL.doc
Скачиваний:
4
Добавлен:
01.07.2025
Размер:
8.23 Mб
Скачать

12.9.3. Усечение файлов

Процедура Truncate( VAR f ) связана с прямым доступом в файлы, но с натяжкой. Просто она увязана с процедурой позиционирования Seek.

Назначение процедуры Truncate — «отсекать хвосты» открытого файла f. Вернемся к рис. 12.8. Если текущая позиция соответствует, например, границе 2, то вызовом Truncate ( f ) будут удалены все идущие за ней записи с реальными номерами 3, 4, ... , FileSize(f), a сама граница 2 станет концевой.

Комбинация

Seek ( f, 0 ); { установить в начало файла }

Truncate( f ); { отсечь все за границей 0 }

сделает файл f совершенно пустым. Граница 0 станет первой и последней.

После отсечения нельзя восстановить прежнюю длину (если только не создать все заново). Можно трактовать Truncate как частичное стирание (Erase). С текстовыми файлами процедура Truncate не работает.

Несколько слов о работе EOF( f ) — функции анализа конца файла f. Как только текущая позиция совпадет с концевой границей (см. рис. 12.5), функция EOF (f) начинает возвращать при опросе значение True. Все остальное время она возвращает значение False.

12.10. Процедуры для работы с каталогами

Поскольку Турбо Паскаль ориентирован на работу в среде MS-DOS, естественно, что он содержит средства, специфичные именно для этой ОС. В частности, в системной библиотеке имеются процедуры для работы с каталогами на дисках. Эти процедуры (табл. 12.5 ) практически повторяют набор средств самой MS-DOS. {259}

Таблица 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 ) может определить имя текущего каталога заданного диска. Диск задается его индексом или номером:

  1. — текущий диск

  2. — диск А:

  3. — диск В:

  4. — диск С:

и т.д.

Если задать номер диска, отсутствующего в конфигурации ПЭВМ, то возникнет ошибка. После выполнения процедуры переменная S будет содержать полное имя каталога (с указанием буквы диска). Можно использовать GetDir для получения текущей буквы диска:

GetDir( 0, S );

WriteLn( 'Текущий диск-> ', S[1], S[2] );

Возвращаемое в S значение можно потом без изменений использовать в вызовах ChDir и MkDir. Но если надо приписать к нему имя файла, то не забудьте вставить между ними разделитель '\':

GetDir( 1, S );

FullFileName := S + '\' + FileName;

Однако это не лучшее решение задачи, ибо как быть в случае, если {260} S содержит корневой каталог 'А:\'? Решение может дать процедура FExpand модуля DOS.

Процедура ChDir( S : String ) используется для перехода в какой-либо существующий на диске каталог. Она делает текущим каталог, содержащийся в строке S (точнее, пытается сделать — все зависит от корректности содержимого S). Параметр S может содержать все те же значения, что может принять команда MS-DOS CD (CHDIR). Вот некоторые примеры вызовов:

ChDir('C:\PASCAL\EXE') — задан весь путь;

ChDir('\PASCAL\DOS') — дан путь от корневого каталога;

ChDir('WORK') — переход в подкаталог Work текущего каталога;

ChDir('..') — выход из подкаталога;

ChDir('..\TOOLS') — то же, но с переходом;

ChDir('\') — возврат в корневой каталог;

ChDir('A:') — переход в текущий каталог диска A:

Программа может сама создавать каталоги и подкаталоги, используя процедуру MkDir( S : String ). Параметр S должен содержать корректное имя нового подкаталога и при необходимости путь к нему (маршрут). Если возможно по правилам MS-DOS создать такой каталог, то он будет создан. Перехода в новый каталог при этом не происходит. Примеры обращений к процедуре:

MkDir( 'C:\PASCAL\NEW');

MkDir( 'HOBBY');

MkDir( '..\NEWDIR');

Каталоги можно удалять. Удалить можно любой каталог, если:

  1. он совершенно пуст;

  2. он не является текущим.

Удаление производится процедурой RmDir( S : String ), где S содержит имя удаляемого каталога. Удаление — процедура, симметричная созданию каталога. Примеры будут аналогичны примерам для процедуры MkDir.

Описанными выше процедурами вовсе не исчерпывается набор средств для работы со структурой дисков. Большое число специальных функций реализовано в модуле DOS и рассматривается в гл. 16.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]