Локальные сети персональных компьютеров. Работа с сервером 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 при успешном завершении или код ошибки:
Для копирования файлов можно использовать функцию F3h прерывания INT 21h:
Буфер запроса имеет следующий формат: 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); } |