Отметки времени для файла
Операционная система 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.