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


Anmelden zum Antworten