-1

Я хотел бы сделать произвольный Microsoft FILETIME. Алгоритм является более важным, чем язык программирования Microsoft.

Например, если сегодня 2 июня 2016 года, я хотел бы рассчитать FILETIME в полночь июня 2016 года.

Любая помощь с благодарностью.

[РЕДАКТИРОВАТЬ 2 июня 2016 17:09 вечера Вот программа, которая вызывает у меня головные боли:

Microsoft SYSTEMTIME в наносекундах составляет 1467432000. Microsoft FILETIME в наносекундах для той же отметки даты и времени - 1470186549.

Вот мой алгоритм. Могу я спросить, что я сделал не так?]

void _wapi_time_t_to_filetime(time_t timeval, FILETIME* filetime)
{
    int64_t ticks;

    ticks = ((int64_t)timeval * 10000000) + 116444736000000000ULL;
    filetime->dwLowDateTime = ticks & 0xFFFFFFFF;
    filetime->dwHighDateTime = ticks >> 32;
}


int64_t FileTime_to_POSIX(FILETIME ft)
{
    FILETIME localFileTime;
    FileTimeToLocalFileTime(&ft, &localFileTime);
    SYSTEMTIME sysTime;
    FileTimeToSystemTime(&localFileTime, &sysTime);
    struct tm tmtime = { 0 };
    tmtime.tm_year = sysTime.wYear - 1900;
    tmtime.tm_mon = sysTime.wMonth; // -1;
    tmtime.tm_mday = sysTime.wDay;
    tmtime.tm_hour = sysTime.wHour;
    tmtime.tm_min = sysTime.wMinute;
    tmtime.tm_sec = sysTime.wSecond;
    tmtime.tm_wday = 0;
    tmtime.tm_yday = 0;
    tmtime.tm_isdst = -1;
    time_t ret = mktime(&tmtime);
    return ret;
}


int _tmain(int argc, _TCHAR* argv[])
{
    SYSTEMTIME stUTCStart, stUTCFinish;
    FILETIME  ftStart, ftFinish;

    int64_t elapsedNanoSeconds(0);

    GetSystemTime(&stUTCStart);
    printf("%d nanoseconds\n", ConvertSYSTEMTIMEToNanoseconds(stUTCStart));

    struct tm tmtime = { 0 };
    tmtime.tm_year = 2016 - 1900;
    tmtime.tm_mon = 6; 
    tmtime.tm_mday = 2; 
    tmtime.tm_hour = stUTCStart.wHour;
    tmtime.tm_min = stUTCStart.wSecond;
    tmtime.tm_sec = stUTCStart.wSecond;
    tmtime.tm_wday = stUTCStart.wDayOfWeek;
    tmtime.tm_yday = 132;
    tmtime.tm_isdst = -1;
    time_t ret = mktime(&tmtime);
    _wapi_time_t_to_filetime(ret, &ftStart);

    printf("%d nanoseconds\n", FileTime_to_POSIX(ftStart));
    return 0;


  }

2 ответа2

0

Вот ответ, который я нашел в моно исходном коде.

void _wapi_time_t_to_filetime (time_t timeval, WapiFileTime *filetime)
{
    guint64 ticks;

    ticks = ((guint64)timeval * 10000000) + 116444736000000000ULL;
    filetime->dwLowDateTime = ticks & 0xFFFFFFFF;
    filetime->dwHighDateTime = ticks >> 32;
}
0

Для файловой системы Windows есть как минимум 3 разных времени файла.

Самый простой способ сделать это - PowerShell, это предпочтительный способ при работе с Windows на уровне ОС, и он должен быть правильным для вопроса в области суперпользователя сети обмена стека.

$time = get-date -hour 0 -Minute 0   # this is today midnight
$file = "c:\yourfile.txt"
$file.CreationTime = $time

и если вам нравится:

$file.LastAccessTime = $time
$file.LastWriteTime = $time

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .