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

Программирование для Windows NT

© Александр Фролов, Григорий Фролов
Том 26, часть 1, М.: Диалог-МИФИ, 1996, 272 стр.

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

Атрибуты файла

В этом разделе мы рассмотрим функции программного интерфейса Microsoft Windows NT, с помощью которых можно определить и изменить различные атрибуты файлов.

Размер файла

Размер файла определить очень просто - достаточно вызвать функцию GetFileSize, прототип которой приведен ниже:


DWORD GetFileSize(
  HANDLE  hFile,           // идентификатор файла
  LPDWORD lpFileSizeHigh); // адрес старшего слова для 
                           // размера файла

Функция GetFileSize возвращает младшее 32-разрядное слово 64-разрядного размера файла с идентификатором hFile. Старшее слово размера файла записывается в переменную типа DWORD, адрес которой передается функции через параметр lpFileSizeHigh.

Если функция завершилась без ошибок, вызванная вслед за ней функция GetLastError XE "GetLastError" возвращает значение NO_ERROR. Если же произошла ошибка, функция GetFileSize возвращает значение 0xFFFFFFFF. При этом в слово, адрес которого задается параметром lpFileSizeHigh, записывается значение NULL. Код ошибки можно определить при помощи все той же функции GetLastError.

Для изменения размера файла вы можете выполнить операцию записи в него или использовать описанные выше функции SetFilePointer XE "SetFilePointer" и SetEndOfFile XE "SetEndOfFile" .

Набор флагов файла

Так же как и MS-DOS, операционная система Microsoft Windows NT присваивает файлам при их создании различные флаги (атрибуты). Вы можете определить атрибуты файла при помощи функции GetFileAttributes XE "GetFileAttributes" :


DWORD GetFileAttributes(LPCTSTR lpFileName);

В качестве единственного параметра этой функции необходимо передать полный или частичный путь к файлу. Функция вернет слово, значение которого является логической комбинацией следующих атрибутов:

 Атрибут

 Описание

 FILE_ATTRIBUTE_ARCHIVE

 Файл был архивирован (выгружен)

 FILE_ATTRIBUTE_COMPRESSED

 Файл, имеющий этот атрибут, динамически сжимается при записи и восстанавливается при чтении

 FILE_ATTRIBUTE_NORMAL

 Остальные перечисленные в этом списка атрибуты не установлены

 FILE_ATTRIBUTE_HIDDEN

 Скрытый файл

 FILE_ATTRIBUTE_READONLY

 Файл можно только читать

 FILE_ATTRIBUTE_SYSTEM

 Файл является частью операционной системы

Для установки новых атрибутов вы можете воспользоваться функцией SetFileAttributes:


BOOL SetFileAttributes(
  LPCTSTR lpFileName,        // адрес строки пути к файлу 
  DWORD   dwFileAttributes); // адрес слова с новыми 
                             // атрибутами

Если вам нужно изменить только один из битов слова атрибутов, необходимо вначале получить старое слово атрибутов при помощи функции GetFileAttributes, а затем, изменив в нем только нужные биты, установить новое значение слова атрибутов функцией SetFileAttributes.

Отметки времени для файла

Операционная система Microsoft Windows NT хранит для каждого файла отдельно дату и время его создания, дату и время момента последнего доступа к файлу, а также дату и время момента, когда последний раз выполнялась запись данных в файл.

Всю эту информацию вы можете получить для открытого файла при помощи функции GetFileTime XE "GetFileTime" , прототип которой приведен ниже:


BOOL GetFileTime(
  HANDLE     hFile,            // идентификатор файла 
  LPFILETIME lpCreationTime,   // время создания 
  LPFILETIME lpLastAccessTime, // время доступа 
  LPFILETIME lpLastWriteTime); // время записи

Перед вызовом этой функции вы должны подготовить три структуры типа FILETIME и передать их адреса через параметры lpCreationTime, lpLastAccessTime и lpLastWriteTime. В эти структуры будет записана, соответственно, дата и время создания файла hFile, дата и время момента последнего доступа к файлу, а также дата и время момента, когда последний раз выполнялась запись данных в этот файл.

Структура FILETIME определена следующим образом:


typedef struct _FILETIME 
{  
  DWORD dwLowDateTime;  // младшее слово
  DWORD dwHighDateTime; // старшее слово
} FILETIME;

Согласно документации, в структуре FILETIME хранится 64-разрядное значение даты и времени в виде количества интервалов размером 100 наносекунд от 1 января 1601 года.

Что делать с таким представлением даты и времени?

В программном интерфейсе Microsoft Windows NT предусмотрен набор функций, предназначенных для преобразования этого формата времени в более привычные нам форматы и обратно, а также для сравнения значений времени в формате структуры FILETIME.

С помощью функции FileTimeToSystemTime вы можете преобразовать дату и время из формата структуры FILETIME в более удобный для использования формат, определяемый структурой SYSTEMTIME XE "SYSTEMTIME" :


BOOL FileTimeToSystemTime(
  CONST FILETIME *lpFileTime,  // указатель на структуру 
                               // FILETIME 
  LPSYSTEMTIME  lpSystemTime); // указатель на структуру 
                               // SYSTEMTIME

Структура SYSTEMTIME определена так:


typedef struct _SYSTEMTIME 
{
  WORD wYear;         // год
  WORD wMonth;  // месяц (1 - январь, 2 - февраль, и т. д.)
  WORD wDayOfWeek;    // день недели 
                // (0 - воскресение, 1 - понедельник, и т. д.)
  WORD wDay;          // день месяца
  WORD wHour;         // часы
  WORD wMinute;       // минуты
  WORD wSecond;       // секунды
  WORD wMilliseconds; // миллисекунды
} SYSTEMTIME;

Обратное преобразование формата времени из формата структуры SYSTEMTIME в формат структуры FILETIME можно сделать при помощи функции SystemTimeToFileTime XE "SystemTimeToFileTime" :


BOOL SystemTimeToFileTime(
  CONST SYSTEMTIME *lpSystemTime, // указатель на структуру 
                                  //   SYSTEMTIME 
  LPFILETIME  lpFileTime); // указатель на структуру FILETIME 

Для установки новых отметок времени файла необходимо воспользоваться функцией SetFileTime XE "SetFileTime" :


BOOL SetFileTime(
  HANDLE     hFile,            // идентификатор файла 
  LPFILETIME lpCreationTime,   // время создания 
  LPFILETIME lpLastAccessTime, // время доступа 
  LPFILETIME lpLastWriteTime); // время записи

Если вам нужно сравнить два значения времени в формате FILETIME, то проще всего это сделать при помощи функции CompareFileTime XE "CompareFileTime" :


LONG CompareFileTime(
  CONST FILETIME *lpTime1,  // адрес первой структуры FILETIME
  CONST FILETIME *lpTime2); // адрес второй структуры FILETIME

Если времена и даты, записанные в обеих структурах, равны, функция CompareFileTime возвращает нулевое значение. Если первая дата и вермя больше второго, возвращается значение 1, если же меньше - возвращается отрицательное значение -1.

Для вас могут также представлять интерес еще две функции, выполняющие преобразование формата времени. Это функции FileTimeToDosDateTime XE "FileTimeToDosDateTime" и DosDateTimeToFileTime XE "DosDateTimeToFileTime" , выполняющие, соответственно, преобразование даты и времени из формата структуры FILETIME в формат, принятый в операционной системы MS-DOS, и обратно. Описание этих функций при необходимости вы найдете в SDK.

Получение информации о файле по его идентификатору

С помощью функции GetFileInformationByHandle вы сможете получить разнообразную информацию об открытом файле по его идентификатору:


BOOL GetFileInformationByHandle(
  HANDLE  hFile,                   // идентификатор файла 
  LPBY_HANDLE_FILE_INFORMATION lpFileInformation ); // адрес 
    // структуры, в которую будет записана информация о файле 

Функция GetFileInformationByHandle записывает информацию о файле в структуру типа BY_HANDLE_FILE_INFORMATION XE "BY_HANDLE_FILE_INFORMATION" , определенную следующим образом:


typedef struct _BY_HANDLE_FILE_INFORMATION 
{  
  DWORD    dwFileAttributes;     // атрибуты файла
  FILETIME ftCreationTime;       // время создания файла
  FILETIME ftLastAccessTime;     // время доступа к файлу
  FILETIME ftLastWriteTime;      // время записи в файл
  DWORD    dwVolumeSerialNumber; // серийный номер тома
  DWORD    nFileSizeHigh;   // размер файла (старшее слово)
  DWORD    nFileSizeLow;    // размер файла (младшее слово)
  DWORD    nNumberOfLinks;       // количество связей файла
  DWORD    nFileIndexHigh;  // системный номер файла 
                            // (старшее слово)
  DWORD    nFileIndexLow;   // системный номер файла 
                            // (младшее слово)
} BY_HANDLE_FILE_INFORMATION;

Поле nNumberOfLinks используется приложениями в стандарте POSIX.

Что же касается системного номера файла, то он отличается от идентификатора файла, полученного при помощи функции CreateFile XE "CreateFile" по смыслу и значению. Системные номера файлов являются глобальными и различаются для всех файлов, открытых в системе.

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