Создание, переименование и удаление каталогов
Для работы с сетевыми каталогами вы можете использовать обычные функции MS-DOS, описанные в первом томе "Библиотеки системного программиста". Это возможно благодаря тому, что сетевая оболочка переназначает эти функции, посылая соответствующие запросы файл-серверу.
Однако операции с сетевыми каталогами лучше выполнять с помощью специально предназначенных для этого функций сетевой оболочки. В этом случае, например, при создании каталога вы сможете задавать маску прав доступа к каталогу, а также правильно распознавать ошибочные ситуации, связанные со спецификой сети.
Для создания каталога вы можете воспользоваться функцией CreateDirectory(): int CreateDirectory(BYTE DirectoryHandle, char* DirectoryPath, BYTE MaximumRightsMask);
Параметры DirectoryHandle и DirectoryPath задают создаваемый каталог. Вы можете использовать оба параметра сразу, указывая индекс каталога, в котором вы будете создавать подкаталог (параметр DirectoryHandle ), и имя создаваемого подкаталога (параметр DirectoryPath). Можно также указывать только полный путь к создаваемому каталогу, а в качестве параметра DirectoryHandle задать нулевое значение.
Параметр MaximumRightsMask задает вид доступа, разрешенный пользователям для данного каталога:
Номер бита | Доступ |
0 | Чтение файлов |
1 | Запись в файлы |
2 | Открытие файлов |
3 | Создание файлов |
4 | Удаление файлов |
5 | Можно создавать подкаталоги и задавать для создаваемых подкаталогов права доступа |
6 | Поиск файлов в каталоге |
7 | Изменение атрибутов файлов |
Например, если в маске бит 3 установлен в 1, пользователи могут создавать в каталоге файлы и подкаталоги.
Приведенная ниже программа MAKEDIR позволит вам создавать каталоги и указывать при этом маску прав доступа.
В случае успешного завершения функция CreateDirectory() возвращает нулевое значение, в противном случае - код ошибки:
Код ошибки | Значение |
0x84 | У пользователя недостаточно прав для создания подкаталога в данном каталоге |
0x98 | Указанный при создании каталога том не существует |
0xFF | Неправильно указан путь или имя каталога (например, в указанном каталоге уже существует подкаталог с таким же именем) |
Для переименования уже существующего каталога следует воспользоваться функцией RenameDirectory(): int RenameDirectory(BYTE DirectoryHandle, char* DirectoryPath, char *NewDirectoryName);
Путь к каталогу, имя которого надо изменить, задается параметрами DirectoryHandle и DirectoryPath таким же образом, как и в предыдущей функции. Параметр NewDirectoryName задает новое имя, которое должно иметь размер не более 15 байт.
Функция возвращает ноль в случае успешного завершения или код ошибки:
Код ошибки | Значение |
0x8B | У пользователя недостаточно прав для переименования подкаталога |
0x9B | Неправильно задан индекс каталога в параметре DirectoryHandle |
0x9С | Неправильно указан путь к каталогу |
0x9E | Неправильно задано имя каталога |
Для удаления каталога предназначена функция DeleteDirectory(): int DeleteDirectory(BYTE DirectoryHandle, char* DirectoryPath);
Параметры этой функции задают путь к удаляемому каталогу.
Функция возвращает нулевое значение или код ошибки:
Код ошибки | Значение |
0x8A | У пользователя недостаточно прав для удаления каталога |
0x98 | Указанный при удалении каталога том не существует |
0x9B | Неправильно задан индекс каталога в параметре DirectoryHandle |
0x9С | Неправильно указан путь к каталогу |
0x9F | Каталог используется в настоящее время кем-то из пользователей и не может быть удален |
0xA0 | Удаляемый каталог содержит файлы или подкаталоги, в то время как удалять можно только пустые каталоги |
Для создания каталога без помощи функций библиотеки NetWare C Interface вам следует воспользоваться функцией E2h прерывания INT21h:
На входе: | AH | = | E2h; |
DS:SI | = | Адрес буфера запроса; | |
ES:DI | = | Адрес буфера ответа. | |
На выходе: | AL | = | Код ошибки или 0, если операция завершилась без ошибок. |
Буфер запроса имеет следующий формат: struct REQUEST { WORD PacketLength; // размер пакета запроса BYTE Function; // должно быть равно 10 BYTE DirectoryHandle; // индекс каталога BYTE MaximumGightsMask; // маска прав каталога BYTE PathLength; // длина пути к каталогу BYTE DirectoryPath[PathLength]; // путь к каталогу };
В случае успешного завершения функции регистр AL содержит нулевое значение.
Для удаления каталога также можно воспользоваться функцией E2h прерывания INT 21h. Формат буфера запроса в этом случае должен быть таким: struct REQUEST { WORD PacketLength; // размер пакета запроса BYTE Function; // должно быть равно 11 BYTE DirectoryHandle; // индекс каталога BYTE Reserved; // не используется BYTE PathLength; // длина пути к каталогу BYTE DirectoryPath[PathLength]; // путь к каталогу };
Код ошибки возвращается в регистре AL.
Для изменения имени существующего каталога с помощью функции E2h прерывания INT 21h вы должны задать буфер запроса в следующем формате: struct REQUEST { WORD PacketLength; // размер пакета запроса BYTE Function; // должно быть равно 15 BYTE DirectoryHandle; // индекс каталога BYTE PathLength; // длина пути к каталогу BYTE DirectoryPath[PathLength]; // путь к каталогу BYTE NameLength; // длина нового имени каталога BYTE NewDirectoryName[NameLength]; // новое имя каталога };