Dateizeitänderung
-
Ich will die Zeiten einer Datei ändern, zwar funktioniert es allerdings irgendwie nicht richtig.
die zeiten sind folgende:
-1d+10h+5m-1s+1h-10m also (-47101sek = -13std,-5min,-1sek)allerdings werden bei der datei viele werte abgezogen oder mehrfach dazuaddiert?
void ChangeFileTime(char const * const name, char const * const timeStr) { time_t atime,mtime; struct tm* timeinfo,*timeinfo2; struct stat attr; if(stat(name,&attr)==-1) { perror("error in stat, ChangeFileTime"); return; } atime=&attr.st_atim; mtime=&attr.st_mode; struct utimbuf ttime; ... timeinfo=gmtime(&atime); //konvertiere ins UTC Format timeinfo->tm_sec+=s; timeinfo->tm_min+=m; timeinfo->tm_mday += d; timeinfo->tm_hour +=h; mktime ( timeinfo ); atime=timeinfo; timeinfo2=gmtime(&mtime); timeinfo2->tm_sec+=s; timeinfo2->tm_min+=m; timeinfo2->tm_mday += d; timeinfo2->tm_hour +=h; mktime ( timeinfo2 ); //konvertiere zurück in time_t mtime=timeinfo2; ttime.actime=atime; //der struktur die werte zuweisen ttime.modtime=mtime; if(utime(name, &ttime)==-1) { perror("Fehler bei utime()\n"); return; }
kann mir wer bei der fehlersuche helfen. vorallem wieso werden werte dazuaddiert?
-
Wenn du nur die Angaben d, h, m und s hast, kannst du doch direkt mit atime rechnen.
Der Wert ist schließlich in Sekunden.mktime
berücksichtigt auch die Zeitzone.Bist du dir sicher, dass die Werte für d, h, m und s richtig sind?
Du zeigst nicht, wo du sie her hast.
-
die werte kommen von hier
char *str=timeStr; long x; errno = 0; while ( x = strtol(str, &str, 10), x!=0 && errno == 0) { switch(*str) { case 'd': d+=x; *str++;break; case 'h': h+=x;*str++; break; case 'm': m+=x;*str++; break; case 's': s+=x;*str++;break; default: perror("Unspecified format"); break; } }
ok, da hast du recht hätte mtime eigentlich nicht wirklich gebraucht
habe es nicht in sekunden gewadnelt ghabt,aber heißt das jetzt das ich einfach die sekunden von atime abziehen kann?
p.s habs jetzt in sekunden umgewandelt und einfach von atime abgezogen, allerdings ist dieser sprunghafte zeitänderung immer noch da:
d=d*24*60*60; m=m*60; h=h*60*60; s=s+d+h+m; atime+=s; ttime.actime=atime; ttime.modtime=atime;
-
Hast du dir die Werte von d, h, m und s mal vor und nach dem Auswerten ausgedruckt?
Ich weiß nicht, was du mit atime sonst noch machst aber
ttime.actime += s;
reicht.
Was ist die "sprunghafte zeitänderung"?
Wie äußert sich das?
-
die werte d,h,m,s werden mit null initialisiert.
mit sprunghaft meine ich: das mal der 4 november ist und beim nächsten aufruf ist es mal der 16 dezember,...
-
wenn ich das ganze debugge, kann man sehen, dass bei der initilaisierung von atime(
atime=&attr.st_atim;
)
solch eine zahl steht-1073744448
. ich schätze mal, dass das nicht richtig ist, oder?
was genau passiert da bzw. bekomme ich da einen falschen wert?
-
gefunden
atime=attr.st_atim.tv_sec;
st_atim ist anscheinend ein strutkur, der sekunden und nanosekunden hält
-
Warum denn jetzt Zeiger?
Oh Mann, die hattest du ja von Anfang an. Und der Compiler hat nichts dazu gesagt?
Keine Warnung?
-
hab zeiger benutzt, weil es ohne zeiger eben nicht funktioniert hat (inkompatibler typ time_t und timespan) und habe es sozusagen missbraucht xD
sollte beim nächsten mal genauer auf die fehler schauen xD