INFO: Trabalhar com a estrutura FILETIME

Traduções de Artigos Traduções de Artigos
Artigo: 188768 - Ver produtos para os quais este artigo se aplica.
Expandir tudo | Reduzir tudo

Nesta página

Sumário

Uma hora do ficheiro representa as determinada data e hora em que um determinado ficheiro foi criado, acedido pela última vez ou escrito pela última vez. Uma hora de ficheiro é guardada numa estrutura FILETIME. Esta estrutura é utilizada com várias chamadas de API do Win32.

Mais Informação

A estrutura FILETIME representa o número de intervalos de 100-nanosegundos desde 1 de Janeiro de 1601. A estrutura é constituída por dois valores de 32 bits que combinam para formar um único valor de 64 bits.
   typedef struct _FILETIME {
     DWORD dwLowDateTime;
     DWORD dwHighDateTime;
   } FILETIME;
				
tenha em atenção que se baseia a estrutura FILETIME em intervalos de 100-nanosegundos. É útil definir os símbolos seguintes quando trabalhar com horas de ficheiro. Por exemplo:
   #define _SECOND ((int64) 10000000)
   #define _MINUTE (60 * _SECOND)
   #define _HOUR   (60 * _MINUTE)
   #define _DAY    (24 * _HOUR)
				

Efectuar Arithmetics com horas de ficheiro

É frequentemente necessário efectuar uma aritmética simples no ficheiro vezes. Por exemplo, poderá ser necessário saber quando um ficheiro é 30 dias. Para executar uma aritmética um tempo de ficheiro, necessita de converter o FILETIME um quadword (um 64-bit inteiro), executar a aritmética e, em seguida, converter o resultado para um FILETIME.

Partindo do princípio ft é uma estrutura FILETIME que contém a hora de criação de um ficheiro, o código de exemplo seguinte adiciona 30 dias a hora:
   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 );
				

Definir horas de ficheiro

Pode definir as horas de ficheiro para um ficheiro utilizando a função 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 função permite-lhe modificar a criação, último acesso e escrever pela última vezes sem alterar o conteúdo do ficheiro. Para utilizar esta função, tem de ter um identificador para o ficheiro aberto. Este identificador de ficheiro pode ser obtido a partir de uma chamada para CreateFile() ou OpenFile(). O ficheiro tem de ser aberto com acesso GENERIC_WRITE. Depois de definidos os tempos de ficheiro, deve liberte o identificador de ficheiro através de uma chamada para CloseHandle().

SzFilename assuming é um nome de ficheiro válido e ft é uma estrutura FILETIME, o código de exemplo seguinte define a data de criação para o ficheiro para a hora num 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 ficheiro

A hora do ficheiro se baseia em formato de universal hora coordenada (UTC), Coordinated Time. Tempo baseado em UTC livremente é definido como a data actual e a hora do dia em Greenwich, Inglaterra. Vai provavelmente pretende apresentar a hora ficheiro relativamente à hora local (ou seja, a data e hora do dia para o fuso horário). Para efectuar este procedimento, pode utilizar FileTimeToLocalFileTime() da seguinte forma:
   BOOL FileTimeToLocalFileTime(
     CONST FILETIME *lpFileTime,  // Pointer to UTC file time to convert.
     LPFILETIME lpLocalFileTime   // Pointer to converted file time.
   );
Nota: esta função utiliza as definições actuais para o fuso horário e a hora de Verão. Por conseguinte, caso se trate de hora de Verão, esta função irá ter hora de Verão em consideração, mesmo se a hora que estiver a converter for na hora padrão.

Para apresentar a hora de ficheiro de forma significativa, primeiro tem de convertê-la uma hora de sistema utilizando FileTimeToSystemTime() da seguinte forma:
   BOOL FileTimeToSystemTime(
     CONST FILETIME *lpFileTime, // Pointer to file time to convert.
     LPSYSTEMTIME lpSystemTime   // Pointer to structure to receive
   );                            // system time.
				
estrutura SYSTEMTIME O representa uma data e hora utilizando membros individuais para o mês, dia, ano, dias da semana, hora, minuto, segundo e milisegundos.

Também é preferível apresentar a data e hora num formato consistente com a região actual seleccionada para o sistema. Pode fazê-lo utilizando GetDateFormat() e GetTimeFormat() da seguinte forma:
   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 passar LOCALE_USER_DEFAULT como o primeiro parâmetro para estas funções, forneça para formatar a data/hora passada acordo com para o formato predefinido para a região actual. Neste caso, pode passar nulo para os parâmetros lpFormat.

Partindo do princípio ft é uma estrutura FILETIME que contém um valor UTC, o seguinte código de exemplo imprime data armazenada no 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 );
				

Propriedades

Artigo: 188768 - Última revisão: 23 de janeiro de 2007 - Revisão: 3.3
A informação contida neste artigo aplica-se a:
  • Microsoft Win32 Application Programming Interface nas seguintes 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
Palavras-chave: 
kbmt kbapi kbdatetime kbfileio kbinfo kbkernbase KB188768 KbMtpt
Tradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine translation ou MT), não tendo sido portanto revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 188768

Submeter comentários

 

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