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

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

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

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

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 при успешном завершении или код ошибки:

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

Для того чтобы узнать байт расширенного атрибута файла, используйте функцию GetExtendedFileAttributes():

int GetExtendedFileAttributes(char *FilePath,
                BYTE *ExtendedFileattributes);


Параметр FilePath задает путь к файлу, параметр ExtendedFileattributes определяет адрес байта памяти, в который будет записано значение байта расширенных атрибутов файла.

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

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

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

На входе: AH = B6h;
AL = Выполняемая функция:
00h - получить байт расширенного атрибута;
01h - изменить байт расширенного атрибута;
DS:DX = Адрес буфера, содержащего путь к файлу;
CL = Новое значение расширенного атрибута.
На выходе: AL = 0, если операция завершилась без ошибок, или
код ошибки:
FCh - нет прав для выполнения функции;
FFh - файл не найден;
CL = Если при вызове функции регистр AL содержал значение 00h, в регистр CL будет записано значение расширенного атрибута указанного файла.

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);
}


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