Wie erstelle ich ein beliebiges Microsoft FILETIME?

352
Frank

Ich möchte ein beliebiges Microsoft FILETIME erstellen. Der Algorithmus ist wichtiger als die Programmiersprache von Microsoft.

Wenn zum Beispiel heute der 2. Juni 2016 ist, würde ich das FILETIME gerne um Mitternacht im Juni 2016 berechnen.

Jede Hilfe wird sehr geschätzt.

[EDIT 2. Juni 2016 17:09 PM Hier ist das Programm, das mir Kopfschmerzen bereitet:

Microsoft SYSTEMTIME in Nanosekunden ist 1467432000. Microsoft FILETIME in Nanosekunden für denselben Datumszeitstempel ist 1470186549.

Hier ist mein Algorithmus. Darf ich fragen, was ich falsch gemacht habe?]

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
Programmierfragen sind Off-Topic. Sie sollten wissen, wo Sie es posten sollten, da Sie ein Konto bei [so] haben. Sind Sie dort verboten? DavidPostill vor 7 Jahren 2

2 Antworten auf die Frage

0
Frank

Hier ist die Antwort, die ich im Mono-Quellcode gefunden habe.

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; } 
Die Art und Weise, wie ich diesen Algorithmus anwende, ist falsch. Darf ich fragen, wie man seine Anwendung reparieren kann? Vielen Dank. Frank vor 7 Jahren 0
Bitte benutzen Sie den ** Post Your Answer ** Button nur für aktuelle Antworten. Sie sollten Ihren ursprünglichen Beitrag bearbeiten, um weitere Informationen hinzuzufügen. DavidPostill vor 7 Jahren 1
0
Falco Alexander

Für Windows-Dateisysteme gibt es mindestens 3 verschiedene Zeitdauern.

Der einfachste Weg, dies zu tun, ist Powershell. Dies ist der bevorzugte Weg, wenn auf Windows-Ebene mit Windows gearbeitet wird, und sollte der richtige Weg für eine Frage im Superuser-Bereich des Stack-Exchange-Netzwerks sein.

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

und wenn du magst:

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