Программирование для 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" по смыслу и значению. Системные номера файлов являются глобальными и различаются для всех файлов, открытых в системе. |