FILETIME to __int64

后端 未结 6 2064
日久生厌
日久生厌 2021-01-04 10:11

What is the proper way to convert a FILETIME structure into __int64? Can you please tell me?

相关标签:
6条回答
  • 2021-01-04 10:33

    you can try the code follow. the code is from chromium project

    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;
    }
    
    0 讨论(0)
  • 2021-01-04 10:37

    I don't think you're suppose to: "Do not cast a pointer to a FILETIME structure to either a ULARGE_INTEGER* or __int64* value because it can cause alignment faults on 64-bit Windows."

    Source.

    If you really wanted it would be something like:

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

    But something like:

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

    Is bad.

    0 讨论(0)
  • 2021-01-04 10:42

    Try

    (__int64(filetime.dwHighDateTime)<<32) | __int64(filetime.dwLowDateTime)
    
    0 讨论(0)
  • 2021-01-04 10:43

    I had exactly the same issue, googled for it, and came here. But I also found a useful Microsoft support page at
    https://support.microsoft.com/en-gb/help/188768/info-working-with-the-filetime-structure

    It says:


    Performing Arithmetic with File Times

    It is often necessary to perform a simple arithmetic on file times. For example, you might need to know when a file is 30 days old. To perform an arithmetic on a file time, you need to convert the FILETIME to a quadword (a 64-bit integer), perform the arithmetic, and then convert the result back to a FILETIME.

    Assuming ft is a FILETIME structure containing the creation time of a file, the following sample code adds 30 days to the time:

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

    Edit: I realise this merely confirms some of the other answers, but I thought it was worth adding for clarification.

    0 讨论(0)
  • 2021-01-04 10:51

    Of course you could just pass in an __int64 casted to a filetime as follows *(FILETIME*)&int64Val. This will work fine under Visual C++.

    ie

    __int64 createTime = 0;
    __int64 accessTime = 0;
    __int64 writeTime = 0;
    GetFileTime( hFile, *(FILETIME*)&createTime, *(FILETIME*)&accessTime, *(FILETIME*)&writeTime );
    
    0 讨论(0)
  • 2021-01-04 10:58

    There is no need to revert to arcane constructs using bitwise OR's. The Windows API has got everything you need to do this.

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

    Or if you want to go to __int64 directly.

    __int64 convert_to_int64( const FILETIME & ac_FileTime )
    {
      return static_cast< __int64 > ( convert( ac_FileTime ) ) ;
    }
    
    0 讨论(0)
提交回复
热议问题