Локальные сети персональных компьютеров. Работа с сервером Novell NetWare

       

Создание, переименование и удаление каталогов


Для работы с сетевыми каталогами вы можете использовать обычные функции 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]; // новое имя каталога };

Содержание раздела