MS-DOS для программиста© Александр Фролов, Григорий ФроловТом 19, М.: Диалог-МИФИ, 1995, 253 стр. 3.2. Работа с каталогамиПосле форматирования логический диск содержит корневой каталог. Если диск форматируется как системный, в этом каталоге могут находится дескрипторы файлов операционной системы io.sys , msdos.sys , command.com . Операционная система предоставляет программам пользователя удобный сервис для создания, уничтожения и переименования каталогов. Используя сведения, приведенные в этой книге, вы сможете изменять структуру каталогов сами, не прибегая к услугам MS-DOS. Однако это следует делать только тогда, когда операции с каталогами по каким-то причинам нежелательно выполнять с использованием функций операционной системы. Создание каталогаДля создания каталога используйте функцию 39h
прерывания INT 21h :
Строка, адрес которой передается в регистрах DS:DX, может содержать полный путь, состоящий из имени диска и имени каталога, в котором должен быть создан каталог, или она может состоять только из одного имени каталога. В последнем случае каталог создается в текущем каталоге на текущем диске. Размер строки с именем каталога не должен превышать по длине 64 байта. Удаление каталогаУдалить существующий каталог можно с помощью
функции 3Ah:
Необходимо заметить, что удалить можно только пустой каталог. И это понятно, так как если вы в обход операционной системы удалите непустой каталог, то описанные в этом каталоге файлы и каталоги будут потеряны, а занимаемое ими место невозможно будет распределить другим файлам. Переименование каталогаДля изменения имени каталогов и файлов
предназначена функция 56h:
Файл или каталог, который будет переименован, должен существовать. Если в имени не указан диск или каталог, то подразумевается, что файл или каталог находится в текущем каталоге на текущем диске. Напротив, каталог или файл с новым именем не должен существовать, иначе функция возвратит признак ошибки. Эта функция может перемещать файл из одного каталога в другой, если вы укажите разные пути. Каталоги перемещать нельзя, их можно только переименовывать. Функции библиотеки Borland C++Стандартная библиотека Borland C++ содержат несколько функций, предназначенных для работы с каталогами. getcwdФункция getcwd предназначена для определения текущего каталога. Прототип этой функции описан в файле direct.h: char *getcwd (char *path, int n); Первый параметр этой функции - адрес буфера, в который функция запишет строку, содержащую имя текущего каталога. Размер этого буфера определяется вторым параметром. Если в качестве первого параметра указать NULL, функция динамически закажет буфер длиной n байт из области кучи и вернет его адрес. Эту память впоследствии необходимо будет освободить при помощи функции free. Функция getcwd всегда возвращает указатель на буфер, содержащий текущий каталог. mkdir , rmdir , chdirДля создания и удаления каталогов, изменения текущего каталога имеются функции mkdir , rmdir , chdir . Все эти функции имеют один параметр - путь каталога, который имеет тип (char *). В случае успешного выполнения операции функции возвращают 0, при ошибке - 1. renameДля переименования каталогов (и файлов) предназначена функция rename : int rename (char *oldname, char *newname); Способ ее использования очевиден: необходимо задать старое и новое имя каталога. Можно задавать как полный путь, так и просто имя каталога либо файла. В последнем случае операция переименования выполняется над каталогами или файлами, находящимися в текущем каталоге. Функция может возвращать один из приведенных
ниже кодов ошибки:
Код ошибки EXDEV возвращается в том случае, когда программа указывает разные диски для старого и нового имен файлов или каталогов. Важное замечание: если вы задаете полный путь в программе, составленной на С или С++, повторяйте символ '\' два раза в строке пути. Это нужно для того, чтобы избежать конфликта с форматом представления констант в языке С. Например: ret_code = rename ("c:\\games","c:\\games_new"); Программа DIRCTLПриведем исходный текст небольшой программы DIRCTL (листинг 3.2), использующий перечисленные выше функции. Листинг 3.2. Файл dirctl\dirctl.cpp #include <direct.h> #include <stdlib.h> #include <stdio.h> #include <conio.h> void main(void) { // Константа MAXPATH задает максимальный // размер пути для каталога char current_dir[MAXPATH]; char test_dir[] = "TEST_DIR"; // Запоминаем текущий каталог getcwd (current_dir, MAXPATH); // Пытаемся создать в текущем каталоге новый каталог if(!mkdir (test_dir)) { // Если удалось создать каталог, делаем его текущим chdir (test_dir); printf("\nКаталог создан, для удаления нажмите" "\n клавишу <Enter>, для сохранения - '0'"); if(getche() != '0') { // Для удаления только что созданного каталога // возвращаемся в каталог более высокого уровня chdir (current_dir); rmdir (test_dir); } } // Если каталог с таким именем уже существует или // произошла другая ошибка при создании каталога, // выводим сообщение о невозможности создания каталога. else printf("\nНе могу создать каталог!"); } |