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

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

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

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

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

Ваша программа может копировать файлы либо с локального диска на локальный, либо с локального на сетевой, либо с сетевого на сетевой. Если файл копируется из одного сетевого каталога в другой сетевой каталог, причем эти каталоги расположены на одном файл-сервере, для копирования имеет смысл использовать специальную функцию 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 прерывания INT 21h:

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

Буфер запроса имеет следующий формат:

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


4.4.1. Программа FCOPY

Программа FCOPY (листинг 19) демонстрирует использование функции FileServerFileCopy(). При запуске этой программе необходимо в качестве параметров указать пути к входному и выходному файлам.

// =============================================================
// Листинг 19. Копирование файлов, расположенных на файл-сервере
// Файл fcopy\fcopy.cpp
//
// (C) A. Frolov, 1993
// =============================================================

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <io.h>
#include <sys\stat.h>

extern "C" int GetNetWareShellVersion(char *,char *, char *);
extern "C" int FileServerFileCopy(int, int, long, long, long, long*);

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

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

        int FromHandle;
        int ToHandle;
        long BytesCopied;
        int ccode;

        printf("\n*FCOPY* (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например: fcopy f:\users\my.dat f:\us\my.dat");
                return;
        }
// Параметры должны быть заданы заглавными буквами

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

// Открываем входной файл в двоичном режиме для чтения

        if ((FromHandle = open(argv[1], O_RDONLY | O_BINARY)) == -1)
        {
                printf("Не могу открыть исходный файл\n");
                return;
        }

// Открываем выходной файл в двоичном режиме для чтения
// и записи, разрешаем создание файла, если его еще нет,
// разрешаем запись в файл

        if ((ToHandle = open(argv[2],
                O_CREAT | O_RDWR | O_BINARY, S_IWRITE)) == -1) {
                printf("Не могу открыть выходной файл\n");
                return;
        }

// Копируем файл, длину файла определяем при помощи
// функции filelength()

        ccode = FileServerFileCopy(FromHandle, ToHandle,
                 0, 0, filelength(FromHandle), &BytesCopied);

        if(!ccode)
                printf("Файл скопирован\n");
        else
                printf("Ошибка %02.2X\n", ccode);

// Закрываем файлы

        close(FromHandle);
        close(ToHandle);
}


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