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


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
прерывания INT21h:

На входе: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.









- Начало -  - Назад -  - Вперед -