Локальные сети персональных компьютеров. Работа с сервером Novell NetWare© Александр Фролов, Григорий ФроловТом 4, М.: Диалог-МИФИ, 1993, 168 стр. 3.4. Создание, переименование и удаление каталоговДля работы с сетевыми каталогами вы можете использовать обычные функции MS-DOS, описанные в первом томе "Библиотеки системного программиста". Это возможно благодаря тому, что сетевая оболочка переназначает эти функции, посылая соответствующие запросы файл-серверу. Однако операции с сетевыми каталогами лучше выполнять с помощью специально предназначенных для этого функций сетевой оболочки. В этом случае, например, при создании каталога вы сможете задавать маску прав доступа к каталогу, а также правильно распознавать ошибочные ситуации, связанные со спецификой сети. Для создания каталога вы можете воспользоваться функцией CreateDirectory():
int CreateDirectory(BYTE DirectoryHandle,
char* DirectoryPath, BYTE MaximumRightsMask);
Параметры DirectoryHandle и DirectoryPath задают создаваемый каталог. Вы можете использовать оба параметра сразу, указывая индекс каталога, в котором вы будете создавать подкаталог (параметр DirectoryHandle ), и имя создаваемого подкаталога (параметр DirectoryPath). Можно также указывать только полный путь к создаваемому каталогу, а в качестве параметра DirectoryHandle задать нулевое значение. Параметр MaximumRightsMask задает вид доступа, разрешенный пользователям для данного каталога:
Например, если в маске бит 3 установлен в 1, пользователи могут создавать в каталоге файлы и подкаталоги. Приведенная ниже программа MAKEDIR позволит вам создавать каталоги и указывать при этом маску прав доступа. В случае успешного завершения функция CreateDirectory() возвращает нулевое значение, в противном случае - код ошибки:
Для переименования уже существующего каталога следует воспользоваться функцией RenameDirectory():
int RenameDirectory(BYTE DirectoryHandle,
char* DirectoryPath, char *NewDirectoryName);
Путь к каталогу, имя которого надо изменить, задается параметрами DirectoryHandle и DirectoryPath таким же образом, как и в предыдущей функции. Параметр NewDirectoryName задает новое имя, которое должно иметь размер не более 15 байт. Функция возвращает ноль в случае успешного завершения или код ошибки:
Для удаления каталога предназначена функция DeleteDirectory():
int DeleteDirectory(BYTE DirectoryHandle,
char* DirectoryPath);
Параметры этой функции задают путь к удаляемому каталогу. Функция возвращает нулевое значение или код ошибки:
Для создания каталога без помощи функций библиотеки NetWare C Interface вам следует воспользоваться функцией E2h прерывания INT 21h:
Буфер запроса имеет следующий формат:
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);
}
|

