INFO: Arbeiten mit FILETIME-Struktur

Zusammenfassung

Eine Dateizeit stellt bestimmte Datum und Uhrzeit, an dem eine bestimmte Datei wurde erstellt, zuletzt zugegriffen oder zuletzt geschrieben. Eine Datei wird in eine FILETIME-Struktur gespeichert. Diese Struktur ist mit verschiedenen Win32-API-Aufrufe verwendet.

Weitere Informationen

FILETIME-Struktur darstellt die Anzahl der 100-Nanosekunden-Intervalle seit 1. Januar 1601. Die Struktur besteht aus zwei 32-Bit-Werte, die zu einem einzelnen 64-Bit-Wert.
   typedef struct _FILETIME {     DWORD dwLowDateTime;
DWORD dwHighDateTime;
} FILETIME;

Beachten Sie, dass 100-Nanosekunden-Intervalle FILETIME-Struktur basiert. Es empfiehlt sich beim Arbeiten mit Datei die folgenden Symbole definieren. Beispiel:

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

Arithmetik mit Datei ausführen

Häufig ist es erforderlich, eine einfache arithmetische Operationen auf Datei ausführen. Beispielsweise müssen Sie wissen, wann eine Datei 30 Tage alt ist. Um eine arithmetische Operationen mit einer Zeit auszuführen, FILETIME Vierfachwort (eine 64-Bit-Ganzzahl) konvertiert die Arithmetik, und konvertieren das Ergebnis zu einer FILETIME.


Angenommen, eine FILETIME-Struktur enthält die Erstellungszeit einer Datei ist, hinzugefügt der folgende Beispielcode 30 Tage Zeit:
   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 );

Zeiten der Dateien festlegen

Mit der Funktion SetFileTime() können Sie die Zeiten der Dateien eine Datei festlegen.
   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.
);

Diese Funktion können Sie die Erstellung ändern, Letzter Zugriff und letzten Mal schreiben, ohne den Inhalt der Datei. Um diese Funktion zu verwenden, benötigen Sie ein Handle zu der geöffneten Datei. Diese Datei-Handle erhalten Sie durch einen Aufruf von CreateFile() oder OpenFile(). Die Datei muss mit GENERIC_WRITE. Nachdem die Zeiten der Dateien festgelegt haben, sollten Sie das Datei-Handle durch Aufrufen von CloseHandle() freigeben.


Bei SzFilename ist ein gültiger Dateiname ist eine FILETIME-Struktur und der folgende Code legt das Erstellungsdatum der Datei auf die Zeit in Fuß:

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

Dateizeiten anzeigen

Die Dateizeit basiert auf koordinierte Weltzeit (UTC). UTC-basierte Zeit ist als das aktuelle Datum und Uhrzeit in Greenwich in England grob. Sie möchten wahrscheinlich die Dateizeit in Bezug auf die lokale Zeit (das Datum und eine Uhrzeit für die Zeitzone) angezeigt. Hierzu können Sie FileTimeToLocalFileTime() wie folgt verwenden:

   BOOL FileTimeToLocalFileTime(     CONST FILETIME *lpFileTime,  // Pointer to UTC file time to convert.
LPFILETIME lpLocalFileTime // Pointer to converted file time.
);
Beachten Sie, dass diese Funktion die aktuelle Einstellung für die Zeitzone und Sommerzeit verwendet. Daher ist es Sommerzeit, wird diese Funktion Sommerzeit berücksichtigen auch wenn umwandeln Standardzeit ist.


Um die Dateizeit auf sinnvolle Weise anzuzeigen, müssen Sie zunächst eine Systemzeit mit FileTimeToSystemTime() wie folgt konvertieren:

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

Die SYSTEMTIME-Struktur stellt eine Datums- und Uhrzeitangabe einzelne Elemente für Monat, Tag, Jahr, Wochentag, Stunde, Minute, Sekunde und Millisekunde.


Es empfiehlt sich auch das Datum und die Uhrzeit in einem Format, das mit dem aktuellen Gebietsschema des Systems ausgewählt angezeigt. Sie können dazu mit GetDateFormat() und GetTimeFormat() wie folgt:

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

Durch LOCALE_USER_DEFAULT als ersten Parameter an diese Funktionen übergeben, weisen Sie sie den übergebenen Zeitpunkt nach das Standardformat für das aktuelle Gebietsschema formatieren. In diesem Fall können Sie für die LpFormat-Parameter NULL übergeben.


Angenommen, eine FILETIME-Struktur, die einen UTC-Wert ist, gibt der folgende Beispielcode ft gespeicherte Datum:

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

Eigenschaften

Artikelnummer: 188768 – Letzte Überarbeitung: 08.01.2017 – Revision: 1

Feedback