erstell- bzw. änderungsdatum einer datei mit dem system-datum vergleichen
-
Hallo zusammen,
ich schreibe gerade ein Programm das die Aufgaben für den Tag anzeigt. Dabei gibt es 2 Dateien. In einer werden die Aufgaben für heute gespeichert und in der anderen die vorgenommenen Aufgaben für morgen, die heut eingegeben werden. Wird nun das programm am nächsten tag gestartet, wird die datei von gestern gelöscht und die 2. datei in die erste umbenannt und die 2. (aufgaben für morgen) wird wieder neu erstellt. wird nun das programm am selben tag wieder geöffnet würde ja wieder das selbe passieren, was aber nicht passieren soll.
Daher brauche ich eine methode um zu überprüfen ob die datei heute erstellt wurde oder von gestern ist.
-
also ich glaube mich daran zu erinnern dass es in Windows dazu eine Methode gibt, such mal nach
GetFileTime() oder sobin mir aber nicht mehr sicher ob das ein C, oder C++ Befehl was
lg
----------------------------------------------------------------------------------
sry das funzt nur unter C++
-
KnufflPuffl schrieb:
sry das funzt nur unter C++
der geht doch sicher unter c oder?
BOOL WINAPI GetFileTime( __in HANDLE hFile, __out_opt LPFILETIME lpCreationTime, __out_opt LPFILETIME lpLastAccessTime, __out_opt LPFILETIME lpLastWriteTime );
lg lolo
-
Hallo,
ein bisschen mehr Unabhängigkeit bekommst du mit der Funktion fstat bzw. _fstat:
http://codewiki.wikidot.com/c:system-calls:fstat
http://msdn.microsoft.com/en-us/library/aa246905(VS.60).aspxGruß,
B.B.
-
Oder vllt. noch besser, die Funktion stat bzw. _stat benutzen, dann brauchst du den doofen Filedescriptor nicht.
-
wie man die Zeit aufruft, wann die datei erstellt wurde, würde ich auch mit _stat machen, allerdings geht es mir darum ,wie ich sie mit der Systemzeit/datum vergleichen kann. ihc hab kein plan wie man die systemzeit abruft. und kann man dann das mit der dateizeit vergleichen??
-
struct stat st; //get stats stat("filename",&st); printf("datei ist %d sekunden alt...",(int)(time(0)-st.st_ctime));
denke da nimmt man dann st_ctime, bin mir aber nicht sicher, und von den typen sind beides "time_t"
lg lolo
-
kann damit auch das datum überprüft werden?? weil mir geht es ja darum, an welchem Tag die datei erstellt wurde un ob die datei nun heute oder gestern erstellt wurde.
-
neo47 schrieb:
kann damit auch das datum überprüft werden?? weil mir geht es ja darum, an welchem Tag die datei erstellt wurde un ob die datei nun heute oder gestern erstellt wurde.
Am verlässlichsten scheint mir die Strukturvariable st_mtime zu sein,
Denn st_atime und st_ctime funzen laut MSDN nur auf NTFS Platten.
Hast du erstmal den Wert als time_t Typ, kannst du alle anderen Infos wie
Tag, Monat, Jahr, Stunde, Minute, Sekunde etc. aus diesem Wert ermitteln.
Für deinen Tag-Vergleich hast du auch noch die Wahl zwischen Day of the month, Day of the year, Weekday, etc.
Findest du alles hier:
http://www.cplusplus.com/reference/clibrary/ctime/strftime/
Für Zeitdifferenzen könnte auch difftime interessant sein
http://www.cplusplus.com/reference/clibrary/ctime/difftime/
-
ich habs geschafft. Wenns euch interressiert, hier ist der code.
Wahrscheinlich für euch nichts ausergewöhnliches. Ein kurzes Statement wäre nicht schlecht, bin noch nicht lange am programmieren.#include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #ifdef __unix__ #include <sys/stat.h> #include <sys/types.h> #else #include <sys\stat.h> #endif #define MAXLAENGE 110 void ausgabe_aufgaben_heute(void) { char puffer[MAXLAENGE]; FILE *today; today = fopen("today.txt", "r"); if(NULL != today) { printf("\n\n\n\t\tAufgaben heute:\n\n"); while(NULL != fgets(puffer, MAXLAENGE, today)) fputs(puffer, stdout); } else printf("Fehler beim öffnen von \"today.txt\""); } void tomorrow_einlesen(void) { FILE *tomorrow; char puffer[MAXLAENGE]; tomorrow = fopen("tomorrow.txt", "w"); if(NULL != tomorrow) { printf("Aufgaben für morgen zeilenweise eingeben. Mit ? beenden:\n"); do { fgets(puffer, MAXLAENGE, stdin); if(puffer[0] != '?') fputs(puffer, tomorrow); else break; } while(1); } else printf("Datei konnte nicht angelegt werden.\n"); printf("Eingabe \" Aufgaben morgen\" beendet.\n\n"); fclose(tomorrow); ausgabe_aufgaben_heute(); } int main(void) { char puffer_datum[80]; char puffer_aufgaben_heute[80]; time_t rawtime; FILE *today; FILE *tomorrow; struct stat attribute; //Daten für today.txt struct tm * timeinfo; time(&rawtime); timeinfo = localtime(&rawtime); strftime(puffer_datum, 80, "%a %b %d", timeinfo); today = fopen("today.txt", "r"); tomorrow = fopen("tomorrow.txt", "r"); if(today != NULL && tomorrow != NULL) { if(stat("today.txt", &attribute) == -1) { fprintf(stderr,"Fehler bei stat....\n"); return EXIT_FAILURE; } time(&rawtime); timeinfo = localtime(&rawtime); strftime(puffer_datum, 80, "%a %b %d %X %Y ", timeinfo); if(today != NULL && tomorrow != NULL && strncmp(puffer_datum, ctime(&attribute.st_mtime), 10) == 0) { // Dateien vorhanden und sind von heute printf("\t\tAufgaben heute:\n\n"); while(fgets(puffer_aufgaben_heute, 100, today)) fputs(puffer_aufgaben_heute, stdout); fclose(today); fclose(tomorrow); } else if (today != NULL && tomorrow != NULL && strncmp(puffer_datum, ctime(&attribute.st_mtime), 10) != 0) { //Dateien vorhanden, aber nicht von heute fclose(today); fclose(tomorrow); if((remove("today.txt"))== 0) { printf("Aufgaben von gestern wurden gelöscht..\n"); printf("\"tomorrow.txt\" wird in today.txt umbenannt..\n"); if((rename("tomorrow.txt", "today.txt")) == 0) { printf("Datei wurde umbenannt..\n"); printf("\"tomorrow.txt\" wird neu erstellt..\n"); tomorrow_einlesen(); } else { printf("Fehler beim umbennen"); return EXIT_FAILURE; } } else { printf("Fehler beim Löschen der Datei \"today.txt\""); return EXIT_FAILURE; } } else { printf("Unbekannte Dateisituation :-)"); return EXIT_FAILURE; } } else { printf("Aufgaben für heute und morgen noch nicht festgelegt.\n"); printf("Datei today.txt wird angelegt..\n"); today = fopen("today.txt", "w"); if(NULL != today) { printf("Aufgaben für heute zeilenweise eingeben. Mit ? beenden:\n"); do { fgets(puffer_aufgaben_heute, MAXLAENGE,stdin); if(puffer_aufgaben_heute[0] != '?') fputs(puffer_aufgaben_heute, today); else break; } while(1); } else printf("Datei konnte nicht erzeugt werden.\n"); printf("Eingabe \"Aufgaben heute\" beendet.\n\n"); fclose(today); printf("Datei tomorrow.txt wird angelegt..\n"); tomorrow_einlesen(); } printf("\n\n"); system("Pause"); }
-
neo47 schrieb:
Ein kurzes Statement wäre nicht schlecht, bin noch nicht lange am programmieren.
Die Dateinamen sind hartkodierte Zeichenliterale. Besser wäre wären irgendwo zwei char*,
welche die Dateinamen speichern. Damit ist das Programm besser wartbar/änderbar
(vielleicht möchtest du auch die Dateinamen über eine Konfigurationsdatei oder über
die Eingabeaufforderung variabel machen?). Das gleiche gilt für die Ausgabe der
Meldungen/Fehlermeldungen. Einchar* err[]={"No error", "Error msg1", "Error msg2", ... };
für die Fehlermeldungen sowie ein
char* msg[]={"Tasks today", "Yesterdays tasks deletetd", ... };
für die anderen Meldungen sind die bessere Wahl (zu erwägen ist auch eine Internationalisierung,
wenn vllt. auch für ein anderes Projekt?).Das Programm lässt sich um einiges verkürzen:
Die Eingabe der Aufgaben heute/morgen kann eine Funktion übernehmen.
Das Öffnen der Dateien zum Lesen/Schreiben kann ebenfalls in einer Funktion passieren,
das Umbenennen/Löschen der Dateien auch ... dann hast du auch die Ausgaben eventueller
Fehlermeldungen/Meldungen an nur einer Position im Code ...Es sind zu viele if/else Anweisungen da. Du kannst z.B. gleich am Anfang
if(today == NULL && tomorrow == NULL) abfragen und wenn der Fall zutrifft,
gleich die entsprechenden Funktionen aufrufen (Funktionen wohlgemerkt, kein if/else Labyrinth :)),
weitere Abfragen dieser Art entfallen und schwupp ist der Code kürzer, besser Lesbar.
Kurzum: Teile das Programm in kleine Teilaufgaben auf (es sei denn du bist Spaghetticodefan :)),
die du von Funktionen erledigen lässt. Diese rufst du in der main Funktion auf (vermeide möglichst sich gegenseitig aufrufende Funktionen), das Programm
lässt sich dann mehr oder weniger wie ein Buch lesen (vermutlich eher weniger :)).tomorrow_einlesen
Vllt. sich noch auf eine Sprache festlegen ...
Das EXIT_FAILURE ist sowas von häßlich ...Ich hoffe, das war nicht allzu niederschmetternd.
Gruß,
B.B.
-
thx, irgendwie muss mans ja lerne. Jetzt kommt aber schon das nächste Problem: Wenn ich die .exe aus dem originalordner rauskopier funktioniert sie nicht mehr. Wie kann das sein?? Wenn ich ein neues Projekt anlege und es damit laufen lassen will geht es auch nicht.
-
pack doch mal die datei namen in variablen dann bist da ein bischen flexibler, und dann versuch mal die absolut anzugeben, wenn das klappt hast auf jeden fall den fehler schon eingegrenzt:)
-
ich hab den Fehler gefunden. Ich bei den Ausgaben die ü, ä ... durch %c und die ascii-zahl ersetzt und dabei %s satt %c benutzt.
Zum Abschluss nochmal danke für eure Hilfe