Änderungsdatum einer Datei ermitteln und ins DateTime Format konvertieren...



  • Ich muss eine funktion schreiben die überprüft ob die vorhandene Datei älter(änderungsdatum der datei, da die gleichnamige datei überkopiert werden soll wenn sie neuer is) is wie die neue Datei:

    if((CompareDateTime(FileDateToDateTime(FileAge(altedatei)),FileDateToDateTime(FileAge(neudatei)))) == LessThanValue)

    Mit FileAge bekomme ich nur das Erstellungsdatum der Datei zurück, brauche aber das Änderungsdatum der Datei, hab schon alles durchsucht finde keine andere Funktion ausser:

    stat(dateiMitPfad.c_str(), &datei_infos);

    ctime(&datei_infos.st_mtime));

    datei_infos.st_mtime hätte genau das was ich brauche, nur wie bekomme ich es in
    das DateTimeFormat konvertiert? Oder in ein normales Datumsformat ?

    Hat einer ne Idee?



  • Versuch es mal so:

    AnsiString FileName; // hier muss Pfad und Name der Datei rein
    TSearchRec sr;
    int iAttributes = faAnyFile;
    SYSTEMTIME sysTime;
    TDateTime dtFileCreated;  // enthält Erstellungsdatum
    TDateTime dtFileLastModified;  // enthält Datum letzte Änderung
    if (FindFirst(FileName, iAttributes, sr) == 0)
    {
    	FileTimeToSystemTime(&(sr.FindData.ftCreationTime), &sysTime);
    	dtFileCreated = TDateTime(sysTime.wHour, sysTime.wMinute, sysTime.wSecond, sysTime.wMilliseconds) + TDateTime(sysTime.wYear, sysTime.wMonth, sysTime.wDay);
    	FileTimeToSystemTime(&(sr.FindData.ftLastWriteTime), &sysTime);
    	dtFileLastModified = TDateTime(sysTime.wHour, sysTime.wMinute, sysTime.wSecond, sysTime.wMilliseconds) + TDateTime(sysTime.wYear, sysTime.wMonth, sysTime.wDay);
    }
    FindClose(sr);
    


  • Danke hast mir damit sehr geholfen, schade nur das die Uhrzeit nicht stimmt, tippe darauf das die Sommerzeit nicht richtig berücksichtig wird, siehe Screenshot:

    http://www.budbrain.de/pics/fast.gif



  • Die Systemzeit wird als UTC angegeben. Mit GetLocalTime() und GetSystemTime() kann man z. B. die Zeitverschiebung ermitteln.



  • Hallo

    Das kann man auch alles den entsprechenden Funktionen überlassen
    Dazu must du nach dem Auslesen des Datums aus dem Struct erstmal die WinAPI-Funktion FileTimeToLocalFileTime anwenden. Danach wie gezeigt FileTimeToSystemTime. Zum Schluß die VCL-Funktion SystemTimeToDateTime.

    bis bald
    akari



  • TSearchRec sr;
     int iAttributes = faAnyFile;
     SYSTEMTIME sysTime;
     GetLocalTime(&sysTime);
    
     TDateTime dtFileCreated;  // enthält Erstellungsdatum
     TDateTime dtFileLastModified;  // enthält Datum letzte Änderung
     if (FindFirst(FileName, iAttributes, sr) == 0)
     {
        FileTimeToSystemTime(&(sr.FindData.ftCreationTime), &sysTime);
        dtFileCreated = TDateTime(sysTime.wHour, sysTime.wMinute, sysTime.wSecond, sysTime.wMilliseconds) + TDateTime(sysTime.wYear, sysTime.wMonth, sysTime.wDay);
        FileTimeToSystemTime(&(sr.FindData.ftLastWriteTime), &sysTime);
        dtFileLastModified = TDateTime(sysTime.wHour, sysTime.wMinute, sysTime.wSecond, sysTime.wMilliseconds) + TDateTime(sysTime.wYear, sysTime.wMonth, sysTime.wDay);
     }
     FindClose(sr);
    
     return dtFileLastModified;
    

    das hat mich auch net weiter gebracht -> GetLocalTime(&sysTime);
    Ich weiss nicht wo Ich genau FileTimeToLocalFileTime anwenden soll?



  • ich vermute mal es sollte dann so aussehen...

    TSearchRec sr; 
     int iAttributes = faAnyFile; 
     SYSTEMTIME sysTime; 
     FILETIME filetime;
    
     TDateTime dtFileCreated;  // enthält Erstellungsdatum 
     TDateTime dtFileLastModified;  // enthält Datum letzte Änderung 
     if (FindFirst(FileName, iAttributes, sr) == 0) 
     { 
        FileTimeToLocalFileTime(&(sr.FindData.ftCreationTime), &filetime);
        FileTimeToSystemTime(&filetime, &sysTime); 
        dtFileCreated = SystemTimeToDateTime(sysTime); 
        FileTimeToLocalFileTime(&(sr.FindData.ftLastWriteTime), &filetime);
        FileTimeToSystemTime(&filetime, &sysTime); 
        dtFileLastModified = SystemTimeToDateTime(sysTime); 
     } 
     FindClose(sr); 
    
     return dtFileLastModified;
    


  • Linnea schrieb:

    ich vermute mal es sollte dann so aussehen...

    TSearchRec sr; 
     int iAttributes = faAnyFile; 
     SYSTEMTIME sysTime; 
     FILETIME filetime;
      
     TDateTime dtFileCreated;  // enthält Erstellungsdatum 
     TDateTime dtFileLastModified;  // enthält Datum letzte Änderung 
     if (FindFirst(FileName, iAttributes, sr) == 0) 
     { 
        FileTimeToLocalFileTime(&(sr.FindData.ftCreationTime), &filetime);
        FileTimeToSystemTime(&filetime, &sysTime); 
        dtFileCreated = SystemTimeToDateTime(sysTime); 
        FileTimeToLocalFileTime(&(sr.FindData.ftLastWriteTime), &filetime);
        FileTimeToSystemTime(&filetime, &sysTime); 
        dtFileLastModified = SystemTimeToDateTime(sysTime); 
     } 
     FindClose(sr); 
    
     return dtFileLastModified;
    

    ja genau so 🙂 vielen dank an alle, ihr seid ne spitzen community, habt mich schon oft rausgerissen 🙂 !



  • Hallo

    Anzumerken wäre noch das bei den WinAPI-Funktion noch das Rückgabeergebnis laut MSDN überprüft werden sollte, und dementsprechend auch eine Fehlerbehandlung eingebaut werden sollte.

    bis bald
    akari



  • Hi. Ich kram mal das Thema raus, da ich mich auch dafür interessiere. Wie genau funktioniert das mit der Prüfung des Rückgabeergebnisses? Auf -1 oder NULL wird dies wohl nicht bezoge sein. Habe mit WinAPI noch nicht allzuviel gemacht. 🤡



  • Hallo

    Was die Rückgabewerte für die einzelnen Funktionen bedeuten kannst du in deren Beschreibung in der MSDN nachlesen. In den meisten Fällen ist es in der Tat eine Überprüfung auf 0 (bzw. false)

    bis bald
    akari



  • Ich meine, was soll drinstehen, wenn es nicht geklappt haben sollte, weil Beispielsweise FileName falsch war? Ich sehe in der Hilfe nirgends "Wenn kein Wert gefunden, dann gibt Funktion ein ??? zurück". Woher weiss ich nun auf was ich die Rückgabe TDateTime kontrollieren soll? Einfaches ausprobieren? 😉



  • WinAPI-Funktionen geben fast immer 0 zurück wenn ein Fehler aufgetreten ist (wie akari schon sagte). Die Art des fehlers bekommt man dann meist mit GetLastError().
    Schau doch einfach mal nach diesen Funktionen in der MSDN.
    Bsp. http://msdn2.microsoft.com/en-us/library/ms724277.aspx



  • Hallo

    Maiky schrieb:

    Woher weiss ich nun auf was ich die Rückgabe TDateTime kontrollieren soll? Einfaches ausprobieren? 😉

    WinAPI-Funktionen geben garantiert kein TDateTime zurück. In deinem speziellen Fall must du eben mit der Fehlerbehandlung nicht erst anfangen wenn du ein TDateTime hast sondern schon wenn die WinAPi-Funktionen aufgerufen werden.

    bis bald
    akari



  • TDateTime __fastcall GetFileLastModified(AnsiString FileName)
    {
        TSearchRec sr;
        int iAttributes = faAnyFile;
        SYSTEMTIME sysTime;
        FILETIME filetime;
    
        TDateTime dtFileLastModified;
        if (FindFirst(FileName, iAttributes, sr)==0)
        {
            if (FileTimeToLocalFileTime(&(sr.FindData.ftLastWriteTime), &filetime))
            {
                if (FileTimeToSystemTime(&filetime, &sysTime)!=0)
                {
                    dtFileLastModified = SystemTimeToDateTime(sysTime);
                }
            }
        }
        FindClose(sr);
    
        return dtFileLastModified;
    }
    

    Und auf was und wie prüfe ich nun letztendlich die Rückgabe?

    TDateTime test;
    Label1->Caption = test; // Ausgabe: 00:00:00
    

    Eigentlich ist test ja kein AnsiString.. bin etwas verwirrt wie ich das korrekt auswerten soll, oder darf ich wirklich if (test!="00:00:00") als Prüfung? Sieht komisch aus. 🤡



  • Intern wird Zeit und Datum in TDateTime als double repräsentiert. Es gibt aber noch einen Konvertierungsoperator für int. Es sollte also

    if (test!=0)
    

    gehen.
    Du kannst natürlich auch eine Exception werfen, wenn die Umwandlung nicht geht.



  • Also Frage ich entweder nach

    if (int(test)!=0)
    

    oder

    if (double(test)!=0)
    

    ab?



  • So wie ich es geschrieben habe sollte es reichen, ansonsten die erstere Variante.


Anmelden zum Antworten