Программирование для 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); В качестве единственного параметра этой функции необходимо передать полный или частичный путь к файлу. Функция вернет слово, значение которого является логической комбинацией следующих атрибутов:
Для установки новых атрибутов вы можете воспользоваться функцией 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" по смыслу и значению. Системные номера файлов являются глобальными и различаются для всех файлов, открытых в системе. |

