2010-12-01 2 views
5

Ich möchte eine Datei überprüfen, um zu sehen, ob es geändert wurde, und wenn es ist, dann laden Sie es erneut .. für diesen begann ich mit dem folgenden Code, der mich nirgends bringt ...Zeitstempel der Datei in C++

#include <sys/types.h> 
#include <sys/stat.h> 
#include <unistd.h> 
#include <iostream> 

using namespace std; 

int main() 
{ 
    struct stat st; 
    int ierr = stat ("readme.txt", &st); 
    if (ierr != 0) { 
      cout << "error"; 
    } 
    int date = st.st_mtime; 
    while(1){ 
      int newdate = st.st_mtime; 
      usleep(500000); 
      if (newdate==date){ 
        cout << "same file.. no change" << endl; 
      } 
      else if (newdate!=date){ 
        cout << "file changed" << endl; 
      } 
    } 
} 

Der gesamte Code ist die gleiche Datei drucken .. keine Änderung kontinuierlich.

+0

'if (newdate == Datum) {...} else if (newdate! = Datum) aussehen sollte {...}' Ich denke, das ist, weil es eine dritte Möglichkeit ist, hier;) – ybungalobill

Antwort

9

Das ist, weil Sie außerhalb der Schleife aufrufen.

Das Ergebnis von stat() ist korrekt zu diesem bestimmten Zeitpunkt. Sie müssen stat() jedes Mal erneut aufrufen, wenn Sie es überprüfen möchten.

+0

: D ROTFL ... Sorry, dass ... danke .. –

2

Nun, Sie stat vor der Schleife. Die Informationen, die Sie durch Ihre ursprüngliche stat erhalten, werden nie aktualisiert. Verschieben Sie den Anruf an stat in die while Schleife.

0

Wenn Sie Linux verwenden und speziell für diese Plattform schreiben, können Sie inotify verwenden, um Sie zu informieren, wenn sich eine Datei ändert, anstatt sie ständig abzufragen.

Siehe Mann inotify zu sehen, wie zu verwenden.

0

ja Sie müssen Stat-Aufruf in While-Schleife verschieben. Ihre while-Schleife wie dieses

while(1){ 
    ierr = stat ("/Volumes/Backup/song.rtf", &st); 
    int newdate = st.st_mtime; 
    usleep(500000); 
    if (newdate==date){ 
     cout << "same file.. no change" << endl; 
    } 
    else if (newdate!=date){ 
     cout << "file changed" << endl; 
    } 
}