将FILETIME
结构转换为__int64
的正确方法是什么?你能告诉我吗?
答案 0 :(得分:16)
我认为您不应该这样做:“不要将FILETIME
结构的指针强加到ULARGE_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);
很糟糕。
答案 1 :(得分:12)
没有必要使用按位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 ) ) ;
}
答案 2 :(得分:5)
尝试
(__int64(filetime.dwHighDateTime)<<32) | __int64(filetime.dwLowDateTime)
答案 3 :(得分: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;
}
答案 4 :(得分:0)
我遇到了完全相同的问题,用谷歌搜索,然后来到这里。但我也在
找到了一个有用的Microsoft支持页面
https://support.microsoft.com/en-gb/help/188768/info-working-with-the-filetime-structure
它说:
使用文件时间执行算术
通常有必要对文件时间执行简单的算术运算。例如,您可能需要知道文件何时过期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 );
编辑:我意识到这仅是其他一些答案的确认,但我认为值得补充说明。
答案 5 :(得分:-2)
当然,您可以将__int64传递给文件时,如下所示*(FILETIME *)&amp; int64Val。这将在Visual C ++下正常工作。
即
__int64 createTime = 0;
__int64 accessTime = 0;
__int64 writeTime = 0;
GetFileTime( hFile, *(FILETIME*)&createTime, *(FILETIME*)&accessTime, *(FILETIME*)&writeTime );