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

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

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

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

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

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

На входе: 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]; // новое имя каталога
};


3.4.1. Программы MAKEDIR, RENMDIR, DELDIR

В этом разделе мы приведем исходные тексты программ, выполняющих основные действия над сетевыми каталогами - создание, переименование и удаление.

Программа MAKEDIR (листинг 12) создает каталог и задает для него маску прав доступа. Имя создаваемого каталога и маска передаются программе при запуске в качестве параметров:

// ===================================================
// Листинг 12. Создание каталога
// Файл makedir\makedir.cpp
//
// (C) A. Frolov, 1993
// ===================================================

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <time.h>

#define BYTE unsigned char
#define WORD unsigned int

extern "C" int GetNetWareShellVersion(char *,char *, char *);
extern "C" int CreateDirectory(BYTE, char*, BYTE);

void main(int argc, char *argv[]) {

        char MajorVersion=0;
        char MinorVersion=0;
        char Revision=0;

        BYTE RightsMask;

        int ccode;

        printf("\n*MAKEDIR* (C) Frolov A., 1993\n");

// Проверяем наличие сетевой оболочки

        asm push si
        GetNetWareShellVersion(&MajorVersion,
                        &MinorVersion, &Revision);
        asm pop si

        if(MajorVersion == 0) {
                printf("\nОболочка NetWare не загружена\n");
                return;
        }

// Необходимо задать букву, обозначающую имя
// локального диска и путь к сетевому каталогу

        if(argc < 3) {
                printf("Укажите имя создаваемого каталога и "
                        "права доступа, \nнапример: makedir sys:users RW");
                return;
        }

// Параметры должны быть заданы заглавными буквами

        strupr(argv[1]);
        strupr(argv[2]);

// Определяем маску прав, разбирая второй
// параметр, заданный при запуске программы

        RightsMask = 0x00;

        for(int i = 0; argv[2][i] != '\0' ; i++) {
                switch(argv[2][i]) {
                case 'R':
                        RightsMask |= 1; break;
                case 'W':
                        RightsMask |= 2; break;
                case 'O':
                        RightsMask |= 4; break;
                case 'C':
                        RightsMask |= 8; break;
                case 'D':
                        RightsMask |= 0x10; break;
                case 'P':
                        RightsMask |= 0x20; break;
                case 'S':
                        RightsMask |= 0x40; break;
                case 'M':
                        RightsMask |= 0x80; break;
                case '-':
                        break;
                default:
                        printf("Ошибка в параметрах\n");
                        return;
                }
        }

// Создаем каталог

        ccode = CreateDirectory(0, argv[1], RightsMask);

        if(!ccode)
                printf("Каталог создан\n");
        else
                printf("Ошибка %02.2X\n", ccode);
}


Программа RENMDIR (листинг 13) позволяет переименовать существующий сетевой каталог. Путь к каталогу и его новое имя следует задать в качестве параметров при запуске программы.

// ===================================================
// Листинг 13. Переименование каталога
// Файл renmdir\renmdir.cpp
//
// (C) A. Frolov, 1993
// ===================================================

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <time.h>

#define BYTE unsigned char
#define WORD unsigned int

extern "C" int GetNetWareShellVersion(char *,char *, char *);
extern "C" int RenameDirectory(BYTE, char *, char *);

void main(int argc, char *argv[]) {

        char MajorVersion=0;
        char MinorVersion=0;
        char Revision=0;

        int ccode;

        printf("\n*RENMDIR* (C) Frolov A., 1993\n");

// Проверяем наличие сетевой оболочки

        asm push si
        GetNetWareShellVersion(&MajorVersion,
                        &MinorVersion, &Revision);
        asm pop si

        if(MajorVersion == 0) {
                printf("\nОболочка NetWare не загружена\n");
                return;
        }

// Необходимо задать букву, обозначающую имя
// локального диска и путь к сетевому каталогу

        if(argc < 3) {
                printf("Укажите путь к каталогу и "
                        "новое имя, \nнапример: renmdir sys:users usr");
                return;
        }

// Параметры должны быть заданы заглавными буквами

        strupr(argv[1]);
        strupr(argv[2]);

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

        ccode = RenameDirectory(0, argv[1], argv[2]);

        if(!ccode)
                printf("Каталог переименован\n");
        else
                printf("Ошибка %02.2X\n", ccode);
}


Программа DELDIR (листинг 14) удаляет каталог, путь к которому задан в качестве параметра при запуске программы.

// ===================================================
// Листинг 14. Удаление каталога
// Файл deldir\deldir.cpp
//
// (C) A. Frolov, 1993
// ===================================================

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <time.h>

#define BYTE unsigned char
#define WORD unsigned int

extern "C" int GetNetWareShellVersion(char *,char *, char *);
extern "C" int DeleteDirectory(BYTE, char *);

void main(int argc, char *argv[]) {

        char MajorVersion=0;
        char MinorVersion=0;
        char Revision=0;

        int ccode;

        printf("\n*DELDIR* (C) Frolov A., 1993\n");

// Проверяем наличие сетевой оболочки

        asm push si
        GetNetWareShellVersion(&MajorVersion,
                        &MinorVersion, &Revision);
        asm pop si

        if(MajorVersion == 0) {
                printf("\nОболочка NetWare не загружена\n");
                return;
        }

// Необходимо задать букву, обозначающую имя
// локального диска и путь к сетевому каталогу

        if(argc < 2) {
                printf("Укажите путь к каталогу, "
                        "\nнапример: deldir sys:users");
                return;
        }

// Параметр должен быть задан заглавными буквами

        strupr(argv[1]);

// Удаляем каталог

        ccode = DeleteDirectory(0, argv[1]);

        if(!ccode)
                printf("Каталог удален\n");
        else
                printf("Ошибка %02.2X\n", ccode);
}


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