INFORMACIÓN: Trabajar con la estructura FILETIME

Seleccione idioma Seleccione idioma
Id. de artículo: 188768 - Ver los productos a los que se aplica este artículo
Expandir todo | Contraer todo

En esta página

Resumen

Hora de un archivo representa la fecha específica y la hora en que en el que se creó, último acceso o última se escriben en un archivo determinado. Hora de un archivo se almacena en una estructura FILETIME. Esta estructura se utiliza con varias llamadas API 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. Resulta ú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 Arithmetics con tiempos de archivo

A menudo es necesario realizar una aritmética simple en horas de archivo. Por ejemplo, tiene que saber cuándo un archivo es 30 días. Para realizar una aritmética en una hora de archivo, necesita convertir FILETIME en un quadword (un entero de 64 bits), realizar la aritmética 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 al tiempo:
   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 );
				

Horas de archivo de configuración

Puede establecer los tiempos 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 horas de última escritura sin cambiar el contenido del archivo. Para utilizar esta función, debe tener un identificador al archivo abierto. Este identificador de archivo puede obtenerse una llamada a CreateFile() o OpenFile(). El archivo debe abrirse con acceso GENERIC_WRITE. Tras establecer las horas de archivo, debe liberar el identificador de archivo mediante 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 para el archivo con la hora dentro de 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 horas de archivo

La hora del archivo se basa en 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 hora del día para la zona horaria). Para ello, puede utilizar de manera FileTimeToLocalFileTime():
   BOOL FileTimeToLocalFileTime(
     CONST FILETIME *lpFileTime,  // Pointer to UTC file time to convert.
     LPFILETIME lpLocalFileTime   // Pointer to converted file time.
   );
nota que esta función utiliza la configuración actual para la zona horaria y el horario de verano. Por lo tanto, si es horario de verano, esta función tendrá horario de verano en cuenta, incluso aunque la hora que está convirtiendo es estándar.

Para mostrar la hora de archivo de forma significativa, primero debe convertirlo a una hora de 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.
				
estructura SYSTEMTIME el representa una fecha y tiempo mediante miembros individuales del mes, día, año, día de la semana, hora, minuto, segundo y milisegundo.

También es preferible para mostrar la fecha y 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.
   );
				
por pasar LOCALE_USER_DEFAULT como primer parámetro a estas funciones, le para dar formato el pasado fecha/tiempo según el formato predeterminado para la configuración regional actual. En este caso, puede pasar NULL para los parámetros de lpFormat.

Suponiendo que ft es una estructura FILETIME que contiene un valor de UTC, en 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: martes, 23 de enero de 2007 - Versión: 3.3
La información de este artículo se refiere a:
  • Microsoft Win32 Application Programming Interface sobre las siguientes plataformas
    • Microsoft Windows 95
    • Microsoft Windows 98 Standard Edition
    • Microsoft Windows Millennium Edition
    • Microsoft Windows NT 4.0
    • Microsoft Windows NT 3.51 Service Pack 5
    • Microsoft Windows NT 4.0
    • the operating system: Microsoft Windows 2000
    • the operating system: Microsoft Windows XP
Palabras clave: 
kbmt kbapi kbdatetime kbfileio kbinfo kbkernbase KB188768 KbMtes
Traducción automática
IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.
Haga clic aquí para ver el artículo original (en inglés): 188768

Enviar comentarios

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com