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

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

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

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

4.2. Поиск файлов

Для поиска файлов в каталоге вы можете воспользоваться функцией _ScanFileInformation() (в документации по библиотеке Netware C Interface эта функция называется ScanFileInformation(), однако в самой библиотеке нет функции с этим названием, зато есть функция _ScanFileInformation(), которая делает то же самое). Приведем прототип функции:

int _ScanFileInformation(BYTE DirectoryHandle,
   char *FilePath, BYTE SearchAttributes, int *SequenceNumber,
   char *FileName, BYTE *FileAttributes, 
   BYTE *ExtendedFileAttributes, long *FileSize,
   char *CreationDate, char *LastAccessDate,
   char *LastUpdateDateAndTime, char *LastArchiveDateAndTime,
   long *FileOwnerID);


Параметр DirectoryHandle при вызове функции может содержать индекс просматриваемого каталога или ноль. В последнем случае путь к просматриваемому каталогу должен быть задан через параметр FilePath в виде текстовой строки, закрытой двоичным нулем.

Параметр SearchAttributes определяет, какие типы файлов нужно найти. Этот параметр может принимать следующие значения:

Параметр Значение
0 Обычные файлы
2 Обычные и скрытые файлы
4 Обычные и системные файлы
6 Обычные, скрытые и системные файлы

Параметр SequenceNumber при первом вызове функции должен указывать на переменную, которая имеет значение 0xFFFF. Когда программа будет просматривать содержимое каталога, вызывая функцию в цикле, содержимое этой переменной будет изменяться автоматически.

Параметр FileName должен указывать на буфер размером 15 байт, в который будет записано имя найденного файла.

Атрибуты и расширенные атрибуты будут записаны в байты памяти, которые необходимо указать при помощи параметров FileAttributes и ExtendedFileAttributes.

Размер найденного файла будет записан в переменную, заданную при помощи параметра FileSize.

Сведения о дате создания файла и дате последнего доступа к файлу будут записаны в буферы размером 2 байта, заданные соответственно параметрами CreationDate и LastAccessDate.

Дата и время последнего обновления содержимого файла будут записаны в буфер размером 4 байта, заданный параметром LastUpdateDateAndTime, а дата и время выгрузки - в аналогичный буфер, заданный параметром LastArchiveDateAndTime.

Идентификатор пользователя, создавшего файл, будет записан в переменную типа long, адрес которой задается параметром FileOwnerID. По этому идентификатору с помощью функции GetBinderyObjectName() можно получить имя пользователя.

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

Код ошибки Значение
0x89 У программы нет прав для поиска файлов
0xFF Файл не найден

Для поиска файлов в каталоге можно использовать функцию E3h
прерывания INT 21h:

На входе: AH = E3h;
DS:SI = Адрес буфера запроса;
ES:DI = Адрес буфера ответа;
На выходе: AL = Код ошибки или 0, если операция завершилась без ошибок.

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

struct REQUEST {
        WORD    PacketLength;        // размер пакета запроса
        BYTE    Function;            // должно быть равно 15
        WORD    SequenceNumber;      // номер для просмотра
        BYTE    DirectoryHandle;     // индекс каталога
        BYTE    SearchAttributes;    // тип файлов для поиска
        BYTE    PathLength;          // длина поля пути
        BYTE    DirectoryPath[PathLength]; // путь к каталогу
};


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

struct REPLAY {
        WORD    PacketLength;        // размер пакета
        WORD    SequenceNumber;      // номер для просмотра
        BYTE    FileName[15];        // имя файла
        BYTE    FileAttributes;      // атрибуты файла
        BYTE    ExtendedFileAttributes; // расширенные 
                                        // атрибуты файла
        long    FileSize;               // размер файла в байтах
        BYTE    CreationDate[2];        // дата создания
        BYTE    LastAccessDate[2];      // дата последнего доступа
        BYTE    LastUpdateDateAndTime[4];  // дата и время
                                           // обновления
        BYTE    LastArchiveDateAndTime[4]; // дата и время
                                           // выгрузки
        BYTE    Reserved[60]; // зарезервировано
};


При вызове этой функции в цикле в первый раз в поле SequenceNumber буфера запроса необходимо записать значение 0xFFFF. При последующих вызовах необходимо уменьшать на единицу значение, полученное в поле SequenceNumber буфера ответа и записывать его в поле SequenceNumber буфера запроса. Следует учитывать, что байты в поле SequenceNumber записаны в обратном порядке, поэтому перед уменьшением необходимо переставить байты. Это можно сделать при помощи функции IntSwap() из библиотеки NetWare C Interface.

4.2.1. Программа FSCAN

Приведем программу FSCAN (листинг 17), которая выводит список файлов, расположенных в каталоге, путь к которому задается в качестве параметра при запуске программы. Для каждого найденного в каталоге файла программа выводит имя файла, его размер, байт атрибутов и байт расширенных атрибутов, а также имя пользователя, создавшего файл.

// ===================================================
// Листинг 17. Просмотр списка файлов в каталоге
// Файл fscan\fscan.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 _ScanFileInformation(BYTE, char *, BYTE, int *,
                                        char *, BYTE *, BYTE *, long *,
                                        char *, char *, char *, char *, long *);
extern "C" int GetBinderyObjectName(long, char *, WORD *);

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

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

        int  SequenceNumber;
        char FileName[16];
        BYTE FileAttributes;
        BYTE ExtendedFileAttributes;
        long FileSize;
        BYTE CreationDate[2];
        BYTE LastAccessDate[2];
        BYTE LastUpdateDateAndTime[4];
        BYTE LastArchiveDateAndTime[4];
        long FileOwnerID;

        int ccode;

        char ObjectName[48];
        WORD ObjectType;

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

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

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

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

// В качестве аргумента необходимо задать
// путь к просматриваемому каталогу в виде   SYS:USERS\*

        if(argc < 2) {
                printf("Укажите путь к каталогу, "
                        "например: dirscan sys:users\\*\n");
                return;
        }
        printf("Список файлов в каталоге %s\n", argv[1]);
        printf("--------------------------------------------"
                        "-------------\n");
        printf("Имя     \tРазмер\tАтрибуты\tВладелец\n");
        printf("--------------------------------------------"
                        "-------------\n");

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

        strupr(argv[1]);

// Цикл просмотра каталога

        for(SequenceNumber = 0xFFFF;;) {

// Получаем информацию о содержимом каталога

                ccode = _ScanFileInformation(0, argv[1], 6,
              &SequenceNumber, FileName, &FileAttributes,
              &ExtendedFileAttributes, &FileSize,
              CreationDate, LastAccessDate, LastUpdateDateAndTime, 
              LastArchiveDateAndTime, &FileOwnerID);

// Если были ошибки, завершаем цикл

                if(ccode) break;
                if(FileName[0] == '\0') break;

// Выводим имя файла

                printf("%-12s", FileName);

// Выводим размер файла

                printf("\t%ld", FileSize);

// Выводим байт атрибутов и байт расширенных атрибутов

                printf("\t%02.2X %02.2X\t", FileAttributes,
                                ExtendedFileAttributes);
// Если для каталога определен владелец,
// получаем и выводим имя владельца




                if(FileOwnerID) {
                        GetBinderyObjectName(FileOwnerID,
                    ObjectName, &ObjectType);
                        printf("\t%-12s \n", ObjectName);
                }
                else
                        printf("\t <Нет сведений о владельце> \n");
        }
}


Приведем фрагменты выдачи программы FSCAN при просмотре файлов из каталога SYS:SYSTEM файл-сервера Novell NetWare версии 3.11:

*FSCAN* (C) Frolov A., 1993
Список файлов в каталоге sys:system\*
---------------------------------------------------------
Имя         Размер  Атрибуты        Владелец
---------------------------------------------------------
SYS$LOG.ERR     10852   20 00           SYSPRG       
README.BTR       6689    00 00           SUPERVISOR   

***************

CLIB.NLM           232842  81 00           SYSPRG       
3C503.LAN         11856   81 00           SYSPRG       
PS2MFM.DSK       8759    81 00           SYSPRG       
INSTALL.NLM     160613  81 00           SYSPRG       
NE2000.LAN       11636   81 00           SYSPRG       

***************

BCONNLM.HLP     1583    81 00           SYSPRG       
BROUTER.NLM     15884   81 00           SYSPRG       
BTRIEVE.NLM     64616   01 00           SYSPRG       
NET$OBJ.SYS     2560    26 10           FROLOV       
BTRIEVE.TRN     4096    00 00           SYSPRG       
PRODUCTS.DAT    5120    00 00           SYSPRG       
AUTOEXEC.NCF    203     00 00           SYSPRG       
MODEM.CFG         46      00 00           FROLOV       
IBM$EMS.HLP     84047   00 00           FROLOV       
IBM$DRV.OVL     2144    00 00           FROLOV       
IBM$EMS.OVL     405     00 00           FROLOV       
VIR.DAT             29934   20 00           FROLOV       
NET$PROP.SYS    8364    26 10           FROLOV       
NET$VAL.SYS     33654   26 10           FROLOV       
NETSHLD.NLM     246146  20 00           FROLOV       
VIR$CFG.DAT     838     20 00           SYSPRG       
VIR$LOG.DAT     3146    20 00           SYSPRG       


Файлы с атрибутами 00h и 20h - обычные файлы. Файлы с атрибутами 26h - скрытые и системные. Файл BTRIEVE.NLM имеет байт атрибутов 01, этот файл можно только читать. Файлы с атрибутом 81 - только читаемые файлы, к которым возможен одновременный доступ со стороны нескольких пользователей.

В приведенном выше списке есть файлы, у которых установлен бит Transaction Bit. Для этих файлов включен механизм обработки транзакций, гарантирующий сохранность содержимого файла при аварии в электропитающей сети или по другим аналогичным причинам.

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