datei-datum auslesen



  • Hi Leutz,

    kann mir jemand sagen, wie ich das datum einer datei (also z.b. zuletzt geändert am...) auslesen kann?
    bin noch anfänger!

    thx!!



  • Man muss nicht alles wissen. Man muss nur wissen wo man nachschauen muss. 😉

    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/fileio/base/getfileattributesex.asp

    Ich geh mal davon aus, dass du englisch kannst. Ansonsten hilft dir sicher das noch weiter: http://dict.leo.org



  • erstmal danke, aber sind verdammt viele informationen auf einmal und direkt datei-datum steht da nicht. außerdem ist das ein wenig kompliziert für nen anfänger!!!!!
    Hat vielleicht noch jemand was anderes??



  • Also auf der Seite steht folgender Code:

    BOOL GetFileAttributesEx(
      LPCTSTR lic.txt,
      GET_FILEEX_INFO_LEVELS fInfoLevelId,
      LPVOID lpFileInformation
    );
    

    Und was mach ich jetzt mit dem? Ist der fertig und ich muss ihn nur noch einfügen? ist das ne funktion oder kommts in main rein?



  • Was "leichteres" wirst du nicht finden. Im Endeffekt ist es eh leicht. Du machst dir eine Variable von der Struktur WIN32_FILE_ATTRIBUTE_DATA und übergibst deinen Dateinamen und die Adresse deiner Variable ( & ) der Funktion. Danach sollte dann in dem Element ftLastWriteTime der Struktur das Datum der letzten Änderung stehen. Wie du ftLastWriteTime verwendest findest du auch leicht raus über den Link, den ich dir geschickt habe. Etwas Eigeninitiative deinerseits sollte schon da sein auch für einen Anfänger.

    Versuch es einfach mal rauszubekommen und in Code umzusetzen, wenn du dann Probleme hast, dann poste einfach nochmal (einschließlich Code) und es wird dir geholfen.



  • Ok, ein kleines Beispiel für den Aufruf:

    ...
    WIN32_FILE_ATTRIBUTE_DATA dateidaten;
    
    GetFileAttributesEx("C:\\test\\test.txt", GetFileExInfoStandard, &dateidaten);
    ...
    

    Hiermit werden die Standardinformation der Datei test.txt im Ordner test auf dem Laufwerk C: gelesen und in der Struktur dateidaten gespeichert.



  • das beispiel klappt schonmal! thx! wenn ich jetzt allerdings dateidaten mit cprintf ausgebe bekomm ich ne 32, was sicherlich irgendwie falsch ist.
    Ich schätze mal, dass ich die einzelnen "teile" des structs gesondert ansprechen kann, so wie bei nem array???



  • Nein nicht wie bei einem Array, aber du hast recht man kann sie ansprechen und zwar einfach mit Namen ;). Schau dir mal die Deklaration der Struktur WIN32_FILE_ATTRIBUTE_DATA an. Da findest du u. a. das Element ftLastWriteTime (Datum der letzten Änderung). Das sprichst du einfach so an:

    ...
    dateidaten.ftLastWriteTime
    ...
    

    Da das aber noch ein interenes Format ist, musst du das Datum noch in ein Format umwandeln mit dem du leichter arbeiten kannst. Bei der Deklaration der Struktur (Link oben) ist auch ein Link zu FILETIME zu finden und dort ist wiederum ein Link zu FileTimeToSystemTime(). Diese Funktion wandelt dir das Format von ftLastWriteTime in eine weitere Struktur (SYSTEMTIME) um. In dieser Struktur ist dann dein Datum in Jahr, Monat, Tag, Stunde, Minute, Sekunde, ... aufgeteilt.



  • Also bis hierhin funktioniert es, ich krieg halt bloß irgendne lange zahl mit nem minus davor ausgegeben.

    WIN32_FILE_ATTRIBUTE_DATA dateidaten; 
    
    	GetFileAttributesEx("lic.txt", GetFileExInfoStandard, &dateidaten);
    	cprintf("\n %d", dateidaten.ftLastWriteTime);
    

    mit der FileTimeToSystemTime() komm ich aber überhaupt nicht klar. Also was muss ich da angeben? ich krieg immer irgendwelche fehler

    ich hätte jetzt gedacht, vielleicht:

    BOOL FileTimeToSystemTime(
      const FILETIME* dateidaten,
      LPSYSTEMTIME lpSystemTime
    );
    

    oder

    FileTimeToSystemTime(dateidaten)
    

    aber das geht auch nicht.
    Ansonsten klingt die Beschreibung aber logisch! 🙂



  • questioner schrieb:

    BOOL FileTimeToSystemTime(
      const FILETIME* dateidaten,
      LPSYSTEMTIME lpSystemTime
    );
    

    Das ist nur die Deklaration der Funktion. Wenn du so den Aufruf machen willst, ist es klar, dass du Fehler erhältst. Das sollte dir eigentlich auch nur sagen, was du übergeben musst und was du zurückbekommst. Die Datentypangaben musst du also weglassen, wie BOOL, const FILETIME* und LPSYSTEMTIME.

    questioner schrieb:

    FileTimeToSystemTime(dateidaten)
    

    aber das geht auch nicht.
    Ansonsten klingt die Beschreibung aber logisch! 🙂

    So ist der Aufruf schon besser :). Allerdings hast du den zweiten Parameter vergessen und du musst der Datei Zeiger übergeben. Der Aufruf sollte eher so aussehen:

    ...
    SYSTEMTIME datum;
    ...
    FileTimeToSystemTime(&dateidaten, &datum);
    ...
    

    Ich hoffe du kommst jetzt zurecht. Um die einzelnen Elemente von datum (SYSTEMTIME) anzusprechen, brauchst du natürlich wieder den Punkt "." zwischen datum und dem Namen des Elements ;).



  • WIN32_FILE_ATTRIBUTE_DATA dateidaten; 
    
    	GetFileAttributesEx("lic.txt", GetFileExInfoStandard, &dateidaten);
    	cprintf("\n %d", dateidaten.ftLastWriteTime);
    
    	SYSTEMTIME datum; 
    
    	FileTimeToSystemTime(&dateidaten, &datum);
    

    geht leider nicht. also irgendwo in

    FileTimeToSystemTime(&dateidaten, &datum);
    

    muss nen Fehler sein. Auf der Internetseite die du angegeben hast stand &dateidaten muss als const angegeben werden, liegts vielleicht daran?

    cannot convert '_win32_file_attribute_data *' to 'const_filetime *'
    und
    type mismatch in parameter 'lpFileTIme' (wanted 'const_filetime *', got '_win32_file_attribute_data *')
    sind die fehlermeldungen!



  • hey, man soll es nicht glauben, aber es FUNKTIONIERT!

    THX!!!!!!!!!!!!!!!!!!!!!!

    WIN32_FILE_ATTRIBUTE_DATA dateidaten; 
    
    	GetFileAttributesEx("lic.txt", GetFileExInfoStandard, &dateidaten);
    	// cprintf("\n %d", dateidaten.ftLastWriteTime);
    
    	FILETIME test = dateidaten.ftLastWriteTime;
    	// cprintf("\n %d", test);
    	SYSTEMTIME datum; 
    
    	FileTimeToSystemTime(&test, &datum);
    
    	cprintf("\n %d", datum.wYear);
    	cprintf("\n %d", datum.wMonth);
    	cprintf("\n %d", datum.wDayOfWeek);
    	cprintf("\n %d", datum.wDay);
    
    	getchar();
    

Anmelden zum Antworten