INFO : Utilisez la Structure FILETIME

Résumé

Une heure de fichier représente la date et une heure à laquelle un fichier a été créé, dernier accès ou la dernière écriture dans. Une heure de fichier est stockée dans une structure FILETIME. Cette structure est utilisée avec les différents appels d’API Win32.

Plus d'informations

La structure FILETIME représente le nombre d’intervalles de 100 nanosecondes depuis le 1er janvier 1601. La structure se compose de deux valeurs de 32 bits qui se combinent pour former une seule valeur de 64 bits.
   typedef struct _FILETIME {     DWORD dwLowDateTime;
DWORD dwHighDateTime;
} FILETIME;

Notez que la structure FILETIME est basée sur des intervalles de 100 nanosecondes. Il est utile de définir les symboles suivants lorsque vous travaillez avec les heures de fichier. Par exemple :

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

Exécution d’arithmétique avec les heures de fichier

Il est souvent nécessaire d’effectuer une opération arithmétique simple sur les heures de fichier. Par exemple, vous devrez peut-être savoir quand un fichier est de 30 jours. Pour effectuer une opération arithmétique sur une heure de fichier, vous devez convertir FILETIME un mot quadruple (un entier 64 bits), effectuer l’arithmétique et puis convertir le résultat en FILETIME.


En supposant que le texte intégral est une structure FILETIME contenant l’heure de création d’un fichier, l’exemple de code suivant ajoute 30 jours à la fois :
   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 );

Définition des heures de fichier

Vous pouvez définir les heures de fichier d’un fichier à l’aide de la fonction 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.
);

Cette fonction vous permet de modifier la création, de dernier accès et de temps de la dernière écriture sans modifier le contenu du fichier. Pour utiliser cette fonction, vous devez disposer d’un handle au fichier ouvert. Ce handle de fichier peut être obtenu à partir d’un appel à CreateFile() ou OpenFile(). Le fichier doit être ouvert avec un accès GENERIC_WRITE. Après avoir défini les heures de fichier, vous devez libérer le handle de fichier via un appel à CloseHandle().


En supposant que szFilename est un nom de fichier valide et ft est une structure FILETIME, l’exemple de code suivant définit la date de création du fichier à l’heure figurant dans le texte intégral :

   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);
}

Affichage des heures de fichier

L’heure du fichier est basé sur le temps universel coordonné (UTC). Temps basée sur l’heure UTC est faiblement défini comme la date et l’heure de la journée à Greenwich, Angleterre. Vous souhaiterez probablement afficher l’heure du fichier par rapport à l’heure locale (c'est-à-dire, la date et l’heure de la journée pour votre fuseau horaire). Pour ce faire, vous pouvez utiliser FileTimeToLocalFileTime() comme suit :

   BOOL FileTimeToLocalFileTime(     CONST FILETIME *lpFileTime,  // Pointer to UTC file time to convert.
LPFILETIME lpLocalFileTime // Pointer to converted file time.
);
Notez que cette fonction utilise les paramètres actuels pour le fuseau horaire et l’heure d’été. Par conséquent, s’il s’agit de l’heure d’été, cette fonction prend l’heure d’été en considération, même si le temps que vous convertissez est en heure standard.


Pour afficher l'heure de fichier de manière significative, vous devez d'abord la convertir en heure système à l'aide de FileTimeToSystemTime() comme suit :

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

La structure SYSTEMTIME représente une date et une heure à l’aide de membres individuels pour les mois, jour, année, jour de la semaine, heure, minute, seconde et milliseconde.


Il est également préférable d’afficher la date et l’heure dans un format cohérent avec les paramètres régionaux sélectionné pour le système. Pour cela, à l’aide de GetDateFormat() et GetTimeFormat() comme suit :

   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.
);

En passant LOCALE_USER_DEFAULT comme premier paramètre à ces fonctions, vous indiquez à mettre en forme la date/heure passée en fonction du format par défaut pour les paramètres régionaux en cours. Dans ce cas, vous pouvez passer la valeur NULL pour les paramètres lpFormat.


En supposant que le texte intégral est une structure FILETIME contenant une valeur UTC, l’exemple de code suivant imprime la date entrée dans le texte intégral :

   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 );

Propriétés

ID d'article : 188768 - Dernière mise à jour : 8 janv. 2017 - Révision : 1

Commentaires