Локальные сети персональных компьютеров. Работа с сервером Novell NetWare© Александр Фролов, Григорий ФроловТом 4, М.: Диалог-МИФИ, 1993, 168 стр. 4.3. Изменение атрибутовДля изменения атрибутов файлов, а также другой информации, такой, как время создания файла и идентификатор владельца, можно воспользоваться функцией SetFileInformation(): int SetFileInformation(BYTE DirectoryHandle, char *FilePath, BYTE SearchAttributes, BYTE FileAttributes, BYTE ExtendedFileAttributes, char *CreationDate, char *LastAccessDate, char *LastUpdateDateAndTime, char *LastArchiveDateAndTime, long *FileOwnerID); Параметры этой функции имеют такое же назначение, что и параметры функции _ScanFileInformation(): с помощью параметров DirectoryHandle и FilePath вы должны указать путь к файлу, остальные параметры задают новые значения для атрибутов файла и другой информации, имеющей отношение к файлу. Функция SetFileInformation() возвращает 0 при успешном завершении или код ошибки. Для изменения атрибутов файлов и другой информации о файлах можно использовать функцию E3h прерывания INT 21h:
Буфер запроса имеет следующий формат:
struct REQUEST {
WORD PacketLength; // размер пакета запроса
BYTE Function; // должно быть равно 16
BYTE FileAttributes; // атрибуты файла
BYTE ExtendedFileAttributes; // расширенные
// атрибуты файла
long Reserved; // зарезервировано
BYTE CreationDate[2]; // дата создания
BYTE LastAccessDate[2]; // дата последнего доступа
BYTE LastUpdateDateAndTime[4]; // дата и время
// обновления
BYTE LastArchiveDateAndTime[4]; // дата и время выгрузки
BYTE Reserved[60]; // зарезервировано
BYTE DirectoryHandle; // индекс каталога
BYTE SearchAttributes; // тип файлов для поиска
BYTE PathLength; // длина поля пути
BYTE DirectoryPath[PathLength]; // путь к каталогу
};
Для изменения байта расширенных атрибутов удобно использовать функцию SetExtendedFileAttributes():
int SetExtendedFileAttributes(char *FilePath,
BYTE *NewExtendedFileattributes);
Параметр FilePath задает путь к файлу, а параметр NewExtendedFileattributes - новое значение для байта расширенных атрибутов. Функция возвращает 0 при успешном завершении или код ошибки:
Для того чтобы узнать байт расширенного атрибута файла, используйте функцию GetExtendedFileAttributes():
int GetExtendedFileAttributes(char *FilePath,
BYTE *ExtendedFileattributes);
Параметр FilePath задает путь к файлу, параметр ExtendedFileattributes определяет адрес байта памяти, в который будет записано значение байта расширенных атрибутов файла. Функция возвращает 0 при успешном завершении или код ошибки:
Для получения и изменения расширенных атрибутов файла и можно использовать функцию B6h прерывания INT 21h:
4.3.1. Программа SETEATTRВ программе SETEATTR (листинг 18) мы продемонстрируем использование функции SetExtendedFileAttributes() для изменения байта расширенного атрибута файла, путь к которому указывается в качестве параметра при запуске программы.
// ===================================================
// Листинг 18. Изменение байта расширенных атрибутов
// Файл seteattr\seteattr.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 SetExtendedFileAttributes(char*, BYTE);
void main(int argc, char *argv[]) {
char MajorVersion=0;
char MinorVersion=0;
char Revision=0;
BYTE NewExtendedFileattributes;
int ccode;
printf("\n*SETEATTR* (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("Укажите путь к каталогу и "
"устанавливаемый бит (T или I), "
"\nнапример: seteattr sys:users\my.dat T");
return;
}
// Параметры должны быть заданы заглавными буквами
strupr(argv[1]);
strupr(argv[2]);
// Определяем значение байта расширенных атрибутов
NewExtendedFileattributes = 0x00;
for(int i = 0; argv[2][i] != '\0' ; i++) {
switch(argv[2][i]) {
case 'T':
NewExtendedFileattributes |= 0x10; break;
case 'I':
NewExtendedFileattributes |= 0x20; break;
case '-':
NewExtendedFileattributes = 0; break;
default:
printf("Ошибка в параметрах\n");
return;
}
}
// Изменяем байт расширенных атрибутов
ccode = SetExtendedFileAttributes(argv[1],
NewExtendedFileattributes);
if(!ccode)
printf("Байт расширенных атрибутов изменен\n");
else
printf("Ошибка %02.2X\n", ccode);
}
|

