Локальные сети персональных компьютеров. Работа с сервером 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 определяет, какие типы файлов нужно найти. Этот параметр может принимать следующие значения:
Параметр SequenceNumber при первом вызове функции должен указывать на переменную, которая имеет значение 0xFFFF. Когда программа будет просматривать содержимое каталога, вызывая функцию в цикле, содержимое этой переменной будет изменяться автоматически. Параметр FileName должен указывать на буфер размером 15 байт, в который будет записано имя найденного файла. Атрибуты и расширенные атрибуты будут записаны в байты памяти, которые необходимо указать при помощи параметров FileAttributes и ExtendedFileAttributes. Размер найденного файла будет записан в переменную, заданную при помощи параметра FileSize. Сведения о дате создания файла и дате последнего доступа к файлу будут записаны в буферы размером 2 байта, заданные соответственно параметрами CreationDate и LastAccessDate. Дата и время последнего обновления содержимого файла будут записаны в буфер размером 4 байта, заданный параметром LastUpdateDateAndTime, а дата и время выгрузки - в аналогичный буфер, заданный параметром LastArchiveDateAndTime. Идентификатор пользователя, создавшего файл, будет записан в переменную типа long, адрес которой задается параметром FileOwnerID. По этому идентификатору с помощью функции GetBinderyObjectName() можно получить имя пользователя. Функция поиска файлов _ScanFileInformation() возвращает 0 при успешном завершении или код ошибки:
Для поиска файлов в каталоге можно
использовать функцию E3h
Буфер запроса имеет следующий формат:
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. Для этих файлов включен механизм обработки транзакций, гарантирующий сохранность содержимого файла при аварии в электропитающей сети или по другим аналогичным причинам. |

