INFORMACIÓN: Trabajar con la estructura FILETIME

Resumen

Una hora de archivo representa la fecha y hora específicas en el que fue creado, último acceso o escribió por última un archivo determinado. Una hora de archivo se almacena en una estructura FILETIME. Esta estructura se utiliza con varias llamadas a la API de Win32.

Más información

La estructura FILETIME representa el número de intervalos de 100 nanosegundos desde el 1 de enero de 1601. La estructura consta de dos valores de 32 bits que se combinan para formar un único valor de 64 bits.
   typedef struct _FILETIME {     DWORD dwLowDateTime;
DWORD dwHighDateTime;
} FILETIME;

Tenga en cuenta que se basa la estructura FILETIME en intervalos de 100 nanosegundos. Es útil definir los siguientes símbolos cuando se trabaja con tiempos de archivo. Por ejemplo:

   #define _SECOND ((int64) 10000000)   #define _MINUTE (60 * _SECOND)
#define _HOUR (60 * _MINUTE)
#define _DAY (24 * _HOUR)

Realizar operaciones matemáticas con tiempos de archivo

A menudo es necesario realizar una aritmética simple en tiempos de archivo. Por ejemplo, puede que necesite saber cuando un archivo es de 30 días de antigüedad. Para realizar aritmética en la hora de un archivo, necesita convertir FILETIME en un quadword (un entero de 64 bits), realizar las operaciones aritméticas y, a continuación, convertir el resultado a un FILETIME.


Suponiendo que ft es una estructura FILETIME que contiene la hora de creación de un archivo, el código de ejemplo siguiente agrega 30 días hasta el momento:
   ULONGLONG qwResult;
// Copy the time into a quadword.
qwResult = (((ULONGLONG) ft.dwHighDateTime) << 32) + ft.dwLowDateTime;

// Add 30 days.
qwResult += 30 * _DAY;

// Copy the result back into the FILETIME structure.
ft.dwLowDateTime = (DWORD) (qwResult & 0xFFFFFFFF );
ft.dwHighDateTime = (DWORD) (qwResult >> 32 );

Establecer tiempos de archivo

Puede establecer las horas de archivo para un archivo mediante la función SetFileTime().
   BOOL SetFileTime(     HANDLE hFile,                     // Handle to the file.
CONST FILETIME *lpCreationTime, // Time the file was created.
CONST FILETIME *lpLastAccessTime, // Time the file was last accessed.
CONST FILETIME *lpLastWriteTime // Time the file was last
// written to.
);

Esta función le permite modificar la creación, último acceso y última escritura veces sin cambiar el contenido del archivo. Para utilizar esta función, debe tener un identificador para el archivo abierto. Este identificador de archivo puede obtenerse de una llamada a CreateFile() o OpenFile(). El archivo debe abrirse con acceso de GENERIC_WRITE. Después de establecer los tiempos de archivo, debe liberar el identificador de archivo a través de una llamada a CloseHandle().


SzFilename se supone que es un nombre de archivo válido y ft es una estructura FILETIME, el código de ejemplo siguiente establece la fecha de creación del archivo a la vez contenida en la ft:

   BOOL bResult;   HANDLE hFile = CreateFile( szFilename,
GENERIC_WRITE, // The file must be opened with write access.
FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL );

if (hFile != INVALID_HANDLE_VALUE) {
bResult = SetFileTime( hFile, &ft, NULL, NULL );
CloseHandle(hFile);
}

Mostrar tiempos de archivo

La hora del archivo se basa en la hora universal coordinada (UTC). Tiempo de UTC imprecisa se define como la fecha actual y la hora del día en Greenwich, Inglaterra. Probablemente deseará mostrar la hora de archivo con respecto a la hora local (es decir, la fecha y la hora del día para su zona horaria). Para ello, puede utilizar FileTimeToLocalFileTime() como sigue:

   BOOL FileTimeToLocalFileTime(     CONST FILETIME *lpFileTime,  // Pointer to UTC file time to convert.
LPFILETIME lpLocalFileTime // Pointer to converted file time.
);
Tenga en cuenta que esta función utiliza la configuración actual para la zona horaria y horario de verano. Por lo tanto, si es horario de verano, esta función tendrá horario de verano en cuenta, incluso si es la hora que se va a convertir en hora estándar.


Para mostrar la hora del archivo de forma significativa, debe convertirlo en una hora del sistema con FileTimeToSystemTime() como sigue:

   BOOL FileTimeToSystemTime(     CONST FILETIME *lpFileTime, // Pointer to file time to convert.
LPSYSTEMTIME lpSystemTime // Pointer to structure to receive
); // system time.

La estructura SYSTEMTIME representa una fecha y hora utilizando a miembros individuales para el mes, día, año, día de la semana, hora, minuto, segundo y milisegundo.


También es preferible para mostrar la fecha y la hora en un formato coherente con la configuración regional actual seleccionada para el sistema. Puede hacerlo mediante GetDateFormat() y GetTimeFormat() como sigue:

   int GetDateFormat(     LCID Locale,              // Locale for which date is to be formatted.
DWORD dwFlags, // Flags specifying function options.
CONST SYSTEMTIME *lpDate, // Date to be formatted.
LPCTSTR lpFormat, // Date format string.
LPTSTR lpDateStr, // Buffer for storing formatted string.
int cchDate // Size of buffer.
);

int GetTimeFormat(
LCID Locale, // Locale for which time is to be formatted.
DWORD dwFlags, // Flags specifying function options.
CONST SYSTEMTIME *lpTime, // Time to be formatted.
LPCTSTR lpFormat, // Time format string.
LPTSTR lpTimeStr, // Buffer for storing formatted string.
int cchTime // Size of buffer.
);

Pasando LOCALE_USER_DEFAULT como primer parámetro a estas funciones, les dice dar formato el pasado fecha/hora según el formato predeterminado para la configuración regional actual. En este caso, se puede pasar NULL para los parámetros de lpFormat.


Suponiendo que ft es una estructura FILETIME que contiene un valor de hora UTC, el siguiente código de ejemplo imprime la fecha almacenada en ft:

   SYSTEMTIME st;   char szLocalDate[255], szLocalTime[255];

FileTimeToLocalFileTime( &ft, &ft );
FileTimeToSystemTime( &ft, &st );
GetDateFormat( LOCALE_USER_DEFAULT, DATE_LONGDATE, &st, NULL,
szLocalDate, 255 );
GetTimeFormat( LOCALE_USER_DEFAULT, 0, &st, NULL, szLocalTime, 255 );
printf( "%s %s\n", szLocalDate, szLocalTime );

Propiedades

Id. de artículo: 188768 - Última revisión: 8 ene. 2017 - Revisión: 1

Comentarios