| Локальные сети персональных компьютеров. Работа с сервером 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);
}
 | 


![[Назад]](../../prev.gif)
![[Содеожание]](../../sod.gif)
![[Дальше]](../../next.gif)