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

       

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


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

Всю эту информацию вы можете получить для открытого файла при помощи функции 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:

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:

BOOL SystemTimeToFileTime(

  CONST SYSTEMTIME *lpSystemTime, // указатель на структуру

                                  //   SYSTEMTIME

  LPFILETIME  lpFileTime); // указатель на структуру FILETIME

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

BOOL SetFileTime(

  HANDLE     hFile,            // идентификатор файла

  LPFILETIME lpCreationTime,   // время создания

  LPFILETIME lpLastAccessTime, // время доступа

  LPFILETIME lpLastWriteTime); // время записи

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

LONG CompareFileTime(

  CONST FILETIME *lpTime1,  // адрес первой структуры FILETIME

  CONST FILETIME *lpTime2); // адрес второй структуры FILETIME

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

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


Содержание раздела