Как сделать произвольный Microsoft FILETIME?

287
Frank

Я хотел бы сделать произвольный 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;   } 
-1
Вопрос программирования не по теме. Вы должны знать, где разместить его, так как у вас есть аккаунт на [так]. Вам вопрос запрещен там? DavidPostill 7 лет назад 2

2 ответа на вопрос

0
Frank

Here is the answer I found in the mono source code.

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; } 
То, как я применяю этот алгоритм, неверно. Могу ли я спросить, как исправить его приложение? Спасибо. Frank 7 лет назад 0
Пожалуйста, используйте кнопку ** Опубликовать свой ответ ** только для фактических ответов. Вы должны отредактировать свой оригинальный пост, чтобы добавить дополнительную информацию. DavidPostill 7 лет назад 1
0
Falco Alexander

there are at least 3 different filetimes for windows filesystem.

the easiest way to do it is powershell, this is the preferred way when dealing with Windows on OS level and should be the right way for a question in the superuser area of the stack exchange network.

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

and if you like:

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