Ermitteln wie viele Tage Datei existiert



  • Tag, ich ermittel das Erstelldatum einer Datei und das System Datum.
    Klappt auch alles nur jetzt habe ich ein Problem und zwar ich will die Differenz der beiden Zeiten in Tage ermitteln. Mir fehlt es da an einem Denkanstoss....
    Vielleicht kann mir jemand helfen
    😉



  • msdn meint, rumrechnen soll man mit FILETIME*:
    Low- und High-Parts der FILETIME-Strukturen in ULARGE_INTEGER-Strukturen kopieren und dann mit den QuadPart's der ULARGE_INTEGER-Strukturen normal rumrechnen

    *FILETIME:

    msdn schrieb:

    The FILETIME structure is a 64-bit value representing the number of 100-nanosecond intervals since January 1, 1601 (UTC).

    Zwischen FILETIME und SYSTEMTIME umrechnen:
    FileTimeToSystemTime()
    SystemTimeToFileTime()

    Beispiel (ungetestet und ohne Gewähr ;D):

    FILETIME time1;
    FILETIME time2;
    
    // <-- Hier sollten time1 und time2 irgendwie Werte bekommen ;D
    
    ULARGE_INTEGER time1_int;
    ULARGE_INTEGER time2_int;
    
    // time1 und time2 Low- und Highparts kopieren:
    time1_int.LowPart=time1.dwLowDateTime;
    time1_int.HighPart=time1.dwHighDateTime;
    
    time2_int.LowPart=time2.dwLowDateTime;
    time2_int.HighPart=time2.dwHighDateTime;
    
    // Differenz der beiden in 100ns-Schritten:
    __int64 diff=(__int64)time2_int.QuadPart - (__int64)time1_int.QuadPart;
    
    // Jetzt musst du nur noch die 100ns in Tage umrechnen:
    
    // Differenz in Sekunden:
    // 100ns = 10^-7 Sekunden
    __int64 diff_sekunden=diff/10000000;
    
    // Differenz in Tagen:
    // 1 Tage = 24h * 60m * 60s = 86400 Sekunden
    __int64 diff_tage=diff_sekunden/86400;
    


  • Danke dir aber ich habe die FILETIME Struktur schon in eine SYSTEM Struktur umgerechnet:

    h = CreateFile(pfad,FILE_WRITE_ATTRIBUTES,0,NULL,OPEN_ALWAYS,0,NULL);
    		 GetFileTime(h,&fTime,NULL,NULL);
    		 CloseHandle(h);
    		 FileTimeToSystemTime(&fTime,&sTime);
    		 GetSystemTime(&lTime);
    

    Jetzt habe ich in sTime Zeit/Datum etc. von der Datei und in lTime die lokale Zeit.
    Jetzt weiß ich nicht wie ich am besten auf die Tage komme.
    Habe es so schon probiert aber das ist ja nichts wirklich:

    year = sTime.wYear - lTime.wYear;
    		  month = sTime.wMonth - lTime.wMonth;
    		  day = sTime.wDay - lTime.wDay;
    		  hour = sTime.wHour - lTime.wHour;
    		  minute = sTime.wMinute - lTime.wMinute;
    		  second = sTime.wSecond - lTime.wSecond;
    

    Mir fehlt halt wie gesagt ein kleiner Denkanstoss.



  • FILETIME time1;
    FILETIME time2;
    
    h = CreateFile(pfad,FILE_WRITE_ATTRIBUTES,0,NULL,OPEN_ALWAYS,0,NULL);
    GetFileTime(h,&time1,NULL,NULL);
    CloseHandle(h);
    
    GetSystemTime(&lTime); 
    SystemTimeToFileTime($lTime,$time2);
    
    // Jetzt hast du time1 und time2 und kannst das Beispiel oben benutzen...
    

    msdn schrieb:

    It is not recommended that you add and subtract values from the SYSTEMTIME structure to obtain relative times. Instead, you should

    * Convert the SYSTEMTIME structure to a FILETIME structure.
    * Copy the resulting FILETIME structure to a ULARGE_INTEGER structure.
    * Use normal 64-bit arithmetic on the ULARGE_INTEGER value.



  • Danke.
    Würde aber rein interesse halber aber auch Wissen wie man das mit einer SYSTEMTIME Struktur macht,wenn es möglich ist.



  • Du müsstest dir aus day, month und year jeweils einen timestamp basteln (und FILETIME ist ja quasi ein timestamp) und diese dann voneinander abziehen.
    Hört sich einfach an, man müsste dabei aber z.B. Schalttage/Schaltmonate berücksichtigen...


  • Mod

    Weitaus einfacher ist es die SYSTEMTIME in COleDateTime umzuwandeln und diese voneinander abziehen. Dann hat man ein COleDateTimeSpan und kann die Tage mit GetDays ermitteln. (BTW: COleDateTime gehört wie CString nicht nur zur MFC sondern auch zu ATL).


Anmelden zum Antworten