13

FILETIME将结构转换为的正确方法是什么__int64?你能告诉我吗?

4

6 回答 6

17

我不认为您应该这样做:“不要将指向FILETIME结构的指针转换为 aULARGE_INTEGER*__int64*值,因为它会导致 64 位 Windows 上的对齐错误。”

资源。

如果你真的想要它会是这样的:

__int64 to_int64(FILETIME ft)
{
    return static_cast<__int64>(ft.dwHighDateTime) << 32 | ft.dwLowDateTime;
}

FILETIME ft = // ...
__int64 t = to_int64(ft);

但是像:

FILETIME ft = // ...
__int64 t = *reinterpet_cast<__int64*>(&ft);

不好。

于 2009-10-14T14:30:39.707 回答
16

无需使用按位 OR 恢复到神秘的构造。Windows API 拥有执行此操作所需的一切。

unsigned __int64    convert( const FILETIME & ac_FileTime )
{
  ULARGE_INTEGER    lv_Large ;

  lv_Large.LowPart  = ac_FileTime.dwLowDateTime   ;
  lv_Large.HighPart = ac_FileTime.dwHighDateTime  ;

  return lv_Large.QuadPart ;
}  

或者如果你想直接去 __int64 。

__int64 convert_to_int64( const FILETIME & ac_FileTime )
{
  return static_cast< __int64 > ( convert( ac_FileTime ) ) ;
}
于 2011-12-12T16:20:47.720 回答
7

尝试

(__int64(filetime.dwHighDateTime)<<32) | __int64(filetime.dwLowDateTime)
于 2009-10-14T14:33:14.040 回答
1

当然,您可以将 __int64 转换为文件时间,如下所示 *(FILETIME*)&int64Val。这将在 Visual C++ 下正常工作。

IE

__int64 createTime = 0;
__int64 accessTime = 0;
__int64 writeTime = 0;
GetFileTime( hFile, *(FILETIME*)&createTime, *(FILETIME*)&accessTime, *(FILETIME*)&writeTime );
于 2009-10-14T14:48:22.480 回答
0

你可以试试下面的代码。代码来自铬项目

template <class Dest, class Source>
inline Dest bit_cast(const Source& source) {
    Dest dest;
    memcpy(&dest, &source, sizeof(dest));
    return dest;
}

//FILETIME to __int64

__int64 FileTimeToMicroseconds(const FILETIME& ft) {
    return bit_cast<__int64, FILETIME>(ft) / 10;
}

void MicrosecondsToFileTime(__int64 us, FILETIME* ft) {
    *ft = bit_cast<FILETIME, __int64>(us * 10);
}

int _tmain(int argc, _TCHAR* argv[])
{
    __int64 nTmpUint64 = 13060762249644841;

    time_t unixtime;
    FILETIME nTmpFileTm;
    MicrosecondsToFileTime(nTmpUint64,&nTmpFileTm);

    return 0;
}
于 2014-11-18T14:44:05.947 回答
0

我有完全相同的问题,用谷歌搜索它,然后来到这里。但我还在
https://support.microsoft.com/en-gb/help/188768/info-working-with-the-filetime-structure找到了一个有用的 Microsoft 支持页面

它说:


使用文件时间执行算术

通常需要对文件时间执行简单的算术运算。例如,您可能需要知道文件何时存在 30 天。要对文件时间执行算术运算,您需要将 FILETIME 转换为四字(64 位整数),执行算术运算,然后将结果转换回 FILETIME。

假设 ft 是一个包含文件创建时间的 FILETIME 结构,下面的示例代码将时间增加了 30 天:

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

编辑:我意识到这只是证实了其他一些答案,但我认为值得添加以进行澄清。

于 2020-01-31T01:20:05.203 回答