INFO: Práce s FILETIME struktury

Souhrn

Čas souboru představuje určité datum a čas jakou byl vytvořen, posledního přístupu nebo posledního zápisu do danému souboru. Čas souboru uložena v FILETIME struktury. Tato struktura se používá při různých volání rozhraní API systému Win32.

Další informace

Struktura FILETIME představuje počet 100 nanosecond intervalech od 1 leden 1601. Struktura se skládá z dva 32bitové hodnoty, které společně tvoří jedinou hodnotu 64-bit.
   typedef struct _FILETIME {     DWORD dwLowDateTime;
DWORD dwHighDateTime;
} FILETIME;

Všimněte si, že FILETIME struktura je založena na 100 nanosecond intervalech. Je vhodné definovat následující symboly při práci s časy souboru. Například:

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

Provádění aritmetická s časy souboru

Často je nutné provést jednoduché aritmetické na čas souboru. Například je třeba vědět při soubor je 30 dní. Provádět aritmetické na čas souboru je nutné převést FILETIME quadword (64bitové celé číslo), provádět aritmetické operace a pak převést výsledek zpět FILETIME.


Za předpokladu, že ft je FILETIME struktura obsahující čas vytvoření souboru, následující ukázkový kód přidá 30 dnů na čas:
   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 );

Nastavení času souboru

Časy souboru pro soubor můžete nastavit pomocí funkce 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.
);

Tato funkce umožňuje upravit vytvoření posledního přístupu a čas posledního zápisu beze změny obsahu souboru. Chcete-li použít tuto funkci, musí mít popisovač otevřený soubor. Tento popisovač souboru lze získat z volání funkce CreateFile() nebo OpenFile(). Soubor musí být otevřen pomocí všeobecné_zápis přístup. Po nastavení času souboru měli uvolnit popisovač souboru pomocí volání CloseHandle().


Předpokladu szFilename je platný název souboru a ft FILETIME struktury, následující ukázkový kód nastaví datum vytvoření souboru na čas obsažené v 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);
}

Zobrazení času souboru

Čas souboru je založen na koordinovaný světový čas (UTC). Založené na čase UTC Čas volně definován jako aktuální datum a čas v Greenwich, Anglie. Bude pravděpodobně chcete zobrazit čas souboru s ohledem na místní čas (datum a čas pro časové pásmo). Chcete-li to provést, můžete použít FileTimeToLocalFileTime() takto:

   BOOL FileTimeToLocalFileTime(     CONST FILETIME *lpFileTime,  // Pointer to UTC file time to convert.
LPFILETIME lpLocalFileTime // Pointer to converted file time.
);
Všimněte si, že tato funkce použije aktuální nastavení časového pásma a letního času. Proto je-li letní čas, tato funkce přihlédne letního času, i když je čas, který převádíte v standardní čas.


Chcete-li zobrazit čas souboru srozumitelným způsobem, je nutné nejprve převést na systémový čas pomocí FileTimeToSystemTime() takto:

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

Strukturu SYSTEMTIME představuje datum a čas pomocí jednotlivých členů pro měsíc, den, rok, den v týdnu, hodinu, minutu, druhé a milisekund.


Je také vhodnější zobrazit datum a čas ve formátu, který odpovídá aktuální národní prostředí pro systém. Můžete to provést pomocí GetDateFormat() a GetTimeFormat() takto:

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

Předáním LOCALE_USER_DEFAULT jako první parametr funkce POZVYHLEDAT, dáte jim formátu předaná datum a čas podle výchozí formát pro aktuální národní prostředí. V takovém případě můžete předat NULL pro parametry lpFormat.


Následující ukázkový kód za předpokladu, že ft je FILETIME struktura obsahující hodnotu UTC, vytiskne data uložená v 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 );

Vlastnosti

ID článku: 188768 - Poslední kontrola: 8. 1. 2017 - Revize: 1

Váš názor