2016-05-17 11 views
0
 const boost::filesystem::path fileName("/tmp/hello.log"); 
     if (boost::filesystem::exists(fileName)) 
     { 
      // do sth 
     } 
     else 
     { 
      std::cout << "file doesn't exist: " << std::endl; 
     } 

ist die Frage, die ich habe: (d. H /tmp/hello.log)Warum `boost :: filesystem :: exists` gibt false zurück, wenn eine Datei existiert? Hier

Bevor ich die Log-Datei verarbeiten kann, muss ich überprüfen, ob die Datei abgeschlossen ist. Wenn die Datei nicht vollständig ist, werde ich die Datei später überprüfen. erste unvollständig ist

Die Log-Datei (dh ohne END als letzte Zeile)

$echo "END" >> /tmp/hello.log 

Meine Anwendung läuft:

Simulation ausführen zu können, wähle ich die folgenden Methoden:

Fall I wie erwartet. Mit anderen Worten, meine Anwendung wird es erneut versuchen, wenn die Datei unvollständig ist und später die vollständige Protokolldatei erfolgreich verarbeitet.

Fall II:

Die Protokolldatei zunächst unvollständig ist (dh ohne Ende als letzte Zeile) I verwenden vi manuell eine Zeile am Ende einzufügen, während die Anwendung zur gleichen Zeit hält die folgenden Zeilen überprüft :

 const boost::filesystem::path fileName("/tmp/hello.log"); 
     if (boost::filesystem::exists(fileName)) 
     { 
      // do sth 
     } 
     else 
     { 
      std::cout << "file doesn't exist: " << std::endl; 
     } 

Nachdem ich die letzte Zeile an die Datei angehängt habe, meldet meine Anwendung Fehler und sagt "Datei existiert nicht". Aber in der Tat ist die Protokolldatei da.

Warum in Fall II die Boost-Funktion falsch zurückgibt, während in Fall I die Funktion wahr zurückgibt.

+0

Zunächst, wenn Sie die Datei in VI bearbeiten, öffnen * Sie * die Datei '/ tmp/hello.log'? Nicht nur z.B. 'vi hello.log' in einem anderen Pfad? Zweitens prüft der angezeigte Code nicht, ob die Datei "unvollständig" ist oder nicht, nur wenn sie existiert. Sogar eine "unvollständige" Datei existiert. –

+0

Ich würde raten vi erstellt eine Sicherungskopie, d. H. Zuerst 'Hallo.log' wird umbenannt in' Hallo.log ~ '(oder ähnlich), dann wird' Hallo.log' mit dem neuen Inhalt geschrieben. Zwischen diesen beiden Ereignissen findet Ihr Programm die Datei nicht. –

+0

1> Ich öffne die Datei /tmp/hello.log manuell mit 'vi/tmp/hello.log' 2> Ich habe den Code für die Überprüfung nicht vollständig angezeigt, weil ich nur die Vollständigkeit überprüfe, nachdem ich die Datei gefunden habe. – q0987

Antwort

0

Es ist möglich, dass Ihr Programm nicht über ausreichende Berechtigungen verfügt, um die Datei zu formatieren, oder dass die Anforderung, es stattzufinden, aus anderen Gründen fehlgeschlagen ist.

Beachten Sie in der Dokumentation von boost, dass der Rückgabewert der exists()-Funktion davon abhängt, ob die Stat-Operation einen Fehler zurückgegeben hat oder nicht.

Bool existiert (file_status s) noexcept

Returns: status_known (e) & & s.type() = file_not_found

Bool status_known (file_status s) noexcept

Returns: s.type()! = status_error

http://www.boost.org/doc/libs/1_60_0/libs/filesystem/doc/reference.html#exists

2

warum boost::filesystem::exists gibt false zurück, wenn eine Datei existiert?

Es wird nicht. Die Datei ist nicht vorhanden.

Sie sagen, dass dies funktioniert, wenn Sie die Bearbeitung in vi nicht ausführen. Beachten Sie, dass vi kein einfaches Befehlszeilenprogramm, sondern ein leistungsstarker Texteditor ist.Es kann sehr gut eine temporäre Datei (z. B. /tmp/hello.log~) für Änderungen verwenden. Bis Sie Änderungen speichern, werden diese Änderungen nicht unter /tmp/hello.log gefunden. Sie sollten die Dokumentation vi für weitere Informationen darüber lesen, wie es funktioniert.

Verwandte Themen