boost::filesystem::rename geht nicht [solved]



  • boost::filesystem::rename(pathCopy, pathLeaf);
    

    führt zu folgender Exception

    terminate called after throwing an instance of 'boost::filesystem::filesystem_error'
      what():  boost::filesystem::rename: Der Vorgang wurde erfolgreich beendet: "quadcopy.bin", "quadleaves.bin"
    

    obwohl die Datei pathCopy existiert und pathLeaf nicht existiert. Das Umbenennen sollte also eigentlich kein Problem sein. Auch wenn es in der Fehlermeldung "erfolgreich" heißt: Die Datei wurde nicht umbenannt.

    Was habe ich falsch gemacht?

    Ich benutze Window 7 mit MinGW.


  • Mod

    Vollständiges Minimalbeispiel.

    Außerdem wäre es schick, wenn du englische Fehlermeldungen liefern könntest (die kann man nämlich dann googeln). Die Fehlermeldung scheint von Windows selber zu stammen. Es sieht so aus, als machte Boost hier einen entsprechenden system call, der dann einen Fehlerwert liefert, aber eine recht merkwürdige Rückmeldung über die Art des Fehlers liefert.
    Wie man Windows eine neue Sprache beibringt, kann ich dir aus dem Stegreif zwar nicht sagen, aber ich vermute (oder eher: hoffe!), dass es zumindest irgendwie möglich ist, das System auf Englisch umzustellen.

    Was passiert, wenn du das Windows Konsolenkommando rename (bzw. ren) im gleichen Pfad mit den gleichen Rechten und den gleichen Dateien als Ziel ausführst wie dein Programm?



  • Ich hatte die Datei noch mit einem fstream geöffnet.
    Folgendes lieferte eine sinnvolle Fehlermeldung:

    system((std::string("rename ") + pathCopy + " " + pathLeaf).c_str());
    
    Der Prozess kann nicht auf die Datei zugreifen, da sie von einem anderen Prozess verwendet wird.
    

    Ok, jetzt gehts, danke für die Hilfe.


  • Mod

    Ok, wobei ich das schon als einen Fehler in Boost bezeichnen würde, wenn es da keine vernünftige Fehlermeldung liefert. Mag sein, dass das an dem Zusammenspiel von Boost mit deiner deutschen Locale liegt, aber trotzdem ist das ein Fehler. Würde ich an deiner Stelle mal im Bugtracker melden.



  • SeppJ schrieb:

    Außerdem wäre es schick, wenn du englische Fehlermeldungen liefern könntest (die kann man nämlich dann googeln). Die Fehlermeldung scheint von Windows selber zu stammen. Es sieht so aus, als machte Boost hier einen entsprechenden system call, der dann einen Fehlerwert liefert, aber eine recht merkwürdige Rückmeldung über die Art des Fehlers liefert.

    Ja, die Meldung kommt von Windows selbst. Kennst du die echt noch nicht? Das ist der Text für Fehlercode 0 aka. ERROR_SUCCESS. Auf Englisch heisst der Text "The operation completed successfully.".

    Vermutlich ein Bug in boost::filesystem . Viele Programmierer schludern mit GetLastError , und rufen das erst dort auf wo sie die Fehlermeldung generieren*. Was oft zu spät ist, nämlich wenn dazwischen irgendwas aufgerufen wurde was den "last error" auch im Erfolgsfall setzt und halt funktioniert hat. Was dann zu solchen "lustigen" Fehlermeldungen führt.

    SeppJ schrieb:

    Wie man Windows eine neue Sprache beibringt, kann ich dir aus dem Stegreif zwar nicht sagen, aber ich vermute (oder eher: hoffe!), dass es zumindest irgendwie möglich ist, das System auf Englisch umzustellen.

    IIRC geht das bei Windows 7 nur mit der Ultimate bzw. Enterprise Version so ohne weiteres. Ob es bei Windows 7, wenn man Sprachpakete nachträglich installieren möchte, noch nötig ist als die Englische Version zu installieren weiss ich nicht. (Bei Windows XP war es noch so.)
    Ab Windows 8 ist das kein Thema mehr, da kann man einfach Sprachpakete über Windows Update nachinstallieren.

    * richtig wäre: Sofort nach der API Funktion die fehlgeschlagen ist.


  • Mod

    hustbaer schrieb:

    Ja, die Meldung kommt von Windows selbst. Kennst du die echt noch nicht? Das ist der Text für Fehlercode 0 aka. ERROR_SUCCESS. Auf Englisch heisst der Text "The operation completed successfully.".

    Kannte ich nicht, denn Linux macht so was nicht 🙂



  • Was bekommt man denn unter Linux als Text für Fehlercode 0?
    Empty-String?


  • Mod

    hustbaer schrieb:

    Was bekommt man denn unter Linux als Text für Fehlercode 0?
    Empty-String?

    "Success!". Ich meinte eher, dass ich noch nie die Situation erlebt habe, dass ich diese Meldung als Fehlermeldung erhalte.



  • Hm.
    Gibt's unter Linux auch Funktionen die den "last error code" in bestimmten Fällen auf 0 setzen?
    Wenn nicht, dann würde das die Sache erklären.


Anmelden zum Antworten