Электронная библиотека книг Александра Фролова и Григория Фролова.
Shop2You.ru Создайте свой интернет-магазин
Библиотека
Братьев
Фроловых

MS-DOS для программиста

© Александр Фролов, Григорий Фролов
Том 19, М.: Диалог-МИФИ, 1995, 253 стр.

[Назад] [Содеожание] [Дальше]

3.2. Работа с каталогами

После форматирования логический диск содержит корневой каталог. Если диск форматируется как системный, в этом каталоге могут находится дескрипторы файлов операционной системы io.sys , msdos.sys , command.com .

Операционная система предоставляет программам пользователя удобный сервис для создания, уничтожения и переименования каталогов. Используя сведения, приведенные в этой книге, вы сможете изменять структуру каталогов сами, не прибегая к услугам MS-DOS. Однако это следует делать только тогда, когда операции с каталогами по каким-то причинам нежелательно выполнять с использованием функций операционной системы.

Создание каталога

Для создания каталога используйте функцию 39h прерывания INT 21h :

На входе: AH 39h
DS:DX Адрес строки в формате ASCIIZ, содержащей путь создаваемого каталога
На выходе: AL Код ошибки, если был установлен флаг переноса CF

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

Размер строки с именем каталога не должен превышать по длине 64 байта.

Удаление каталога

Удалить существующий каталог можно с помощью функции 3Ah:

На входе: AH 3Ah
DS:DX Адрес строки в формате ASCIIZ, содержащей путь к каталогу
На выходе: AL Код ошибки, если был установлен флаг переноса CF

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

Переименование каталога

Для изменения имени каталогов и файлов предназначена функция 56h:

На входе: AH 56h
DS:DX Адрес строки в формате ASCIIZ, содержащей старое имя каталога или файла
ES:DI Адрес строки в формате ASCIIZ, содержащей новое имя каталога или файла
На выходе: AL Код ошибки, если был установлен флаг переноса CF

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

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

Функции библиотеки 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);

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

Функция может возвращать один из приведенных ниже кодов ошибки:

Код ошибки Описание
ENOENT Нет такого файла или каталога
EACCES Нет прав доступа
EXDEV Другой диск

Код ошибки 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Не могу создать каталог!");
}

[Назад] [Содеожание] [Дальше]