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

       

Копирование файлов


Ваша программа может копировать файлы либо с локального диска на локальный, либо с локального на сетевой, либо с сетевого на сетевой. Если файл копируется из одного сетевого каталога в другой сетевой каталог, причем эти каталоги расположены на одном файл-сервере, для копирования имеет смысл использовать специальную функцию FileServerFileCopy(). В этом случае процесс копирования будет выполняться непосредственно на файл-сервере, без передачи файла по сети.

Приведем прототип функции FileServerFileCopy():

int FileServerFileCopy(int FromHandle, int ToHandle, long SourceFileOffset, long DestinationFileOffset, long NumberOfBytesToCopy, long *BytesCopied);

Параметры FromHandle и ToHandle указывают индексы файлов, участвующих в процессе копирования. Данные копируются из файла, задаваемого параметром FromHandle в файл, задаваемый параметром ToHandle.

Индексы файлов должны быть получены при помощи вызова функции MS-DOS с кодом 3Dh (открыть файл). Если файла, в который будут копироваться данные, нет на диске, его необходимо создать и открыть при помощи функции MS-DOS с кодом 3Ch. В программе, составленной на языке Си, вы можете использовать для открытия и создания файлов функцию open(), входящую в стандартную библиотеку транслятора.

Параметры SourceFileOffset и DestinationFileOffset задают смещение в исходном и выходном файлах. Если вы копируете файл в новый, эти параметры должны иметь нулевое значение.

Параметр NumberOfBytesToCopy задает количество копируемых байт. Если вам надо скопировать весь файл, его длину можно узнать по индексу файла при помощи функции filelength() из стандартной библиотеки транслятора.

Параметр BytesCopied - указатель на переменную, в которую будет записано количество действительно скопированных байт.

Функция возвращает 0 при успешном завершении или код ошибки:



Код ошибки Значение
0x83 Ошибка ввода/вывода на сетевом диске
0x96 Мало оперативной памяти на файл-сервере

Для копирования файлов можно использовать функцию F3h прерывания INT21h:


На входе: AH = F3h;
ES:DI = Адрес буфера запроса.
На выходе: AL Код ошибки или 0, если операция завершилась без ошибок;
DX,CX = Количество скопированный байт. Старший байт находится в регистре DX, младший - в регистре CX.
Буфер запроса имеет следующий формат:

struct REQUEST { WORD FromHandle; // индекс входного файла WORD ToHandle; // индекс выходного файла long SourceFileOffset; // смещение входного файла long DestinationFileOffset; // смещение выходного файла long NumberOfBytesToCopy; // сколько байт копировать };


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