Создание, удаление и переименование каталогов
После форматирования логический диск содержит корневой каталог. Если диск форматируется как системный, в этом каталоге могут находится дескрипторы файлов операционной системы IO.SYS, MSDOS.SYS, COMMAND.COM.
Операционная система предоставляет программам пользователя удобный сервис для создания, уничтожения и переименования каталогов. Используя сведения, приведенные в этой книге, вы сможете изменять структуру каталогов сами, не прибегая к услугам MS-DOS. Однако это следует делать только тогда, когда операции с каталогами по каким-то причинам нежелательно выполнять с использованием функций операционной системы.
Для создания каталога используйте функцию 39h
прерывания INT21h:
На входе: | AH = 39h |
DS:DX = Адрес строки в формате ASCIIZ, содержащей имя создаваемого каталога. | |
На выходе: | AL = Код ошибки, если был установлен в 1
флаг переноса CF. |
Строка, имени создаваемого каталога может содержать полный путь, состоящий из имени диска и имени каталога, в котором должен быть создан каталог, или она может состоять только из одного имени каталога. В последнем случае каталог создается в текущем каталоге на текущем диске.
Размер строки с именем каталога не должен превышать по длине 64 байта.
Удалить существующий каталог можно с помощью функции 3Ah. Формат вызова этой функции аналогичен предыдущему:
На входе: | AH = 3Ah |
DS:DX =Адрес строки в формате ASCIIZ, содержащей имя удаляемого каталога. | |
На выходе: | AL = Код ошибки, если был установлен в 1
флаг переноса CF. |
Необходимо заметить, что удалить можно только пустой каталог. И это понятно, так как если вы в обход операционной системы удалите непустой каталог, то описанные в этом каталоге файлы и каталоги будут потеряны для вас, а занимаемое ими место невозможно будет распределить другим файлам.
Для изменения имени каталогов и файлов предназначена функция 56h:
На входе: | AH = 56h |
DS:DX = Адрес строки в формате ASCIIZ, содержащей старое имя каталога или файла. | |
ES:DI = Адрес строки в формате ASCIIZ, содержащей новое имя каталога или файла. | |
На выходе: | AL = Код ошибки, если был установлен в 1
флаг переноса CF. |
// Запоминаем текущий каталог
getcwd( current_dir, _MAX_DIR );
// Пытаемся создать в текущем каталоге новый каталог
if(!mkdir(test_dir)) {
// Если удалось создать каталог, делаем его текущим
chdir(test_dir); printf("\nКталог создан, для удаления нажмите" "\nлюбую клавишу, для сохранения - Ctrl-C");
getch();
// Для удаления только что созданного каталога // возвращаемся в каталог более высокого уровня
chdir(current_dir); rmdir(test_dir); }
// Если каталог с таким именем уже существует или // произошла другая ошибка при создании каталога, // выводим сообщение о невозможности создания каталога.
else printf("\nНе могу создать каталог!"); }
Для переименования каталогов (и файлов) предназначена функция rename():
int rename(char *oldname, char *newname);
Способ ее использования очевиден: необходимо задать старое и новое имена каталогов. Можно задавать как полный путь, так и просто имя каталога/файла. В последнем случае операция переименования выполняется над каталогами или файлами, находящимися в текущем каталоге.
Функция может возвращать один из кодов ошибки:
ENOENT | Нет такого файла или каталога |
EACCES | Нет прав доступа |
EXDEV | Другой диск |
Важное замечание: если вы задаете полный путь, в строке пути повторяйте символ '\' два раза. Это нужно для того, чтобы избежать конфликта с форматом представления констант в языке С. Например:
ret_code = rename("c:\\games","c:\\games_new");