2012-04-12 21 views
1

Dieser einfache Code:Welche Berechtigungen sind erforderlich, um boost :: filesystem :: last_write_time erfolgreich auszuführen?

std::time_t tm = boost::filesystem::last_write_time(filename); 
boost::filesystem::last_write_time(directory, tm); 

löst eine „Operation nicht zulässig“ Ausnahme, wenn directory ein Pfad durch einen Benutzer andere als die Ausführung des Codes gehört.

Ich bin ein bisschen durch diese verwirrt, wie ich bin den Umgang mit Verzeichnissen mit 777 oder rwxrwxrwx Berechtigungen, und ich kann einfach ihre Änderungszeiten von touch in einer Schale mit ändern.

Fehle ich etwas? Fordert Boost mehr Berechtigungen als benötigt? Gibt es eine Möglichkeit, das zu beheben?

Hier ist der entsprechende Code in Boost:

handle_wrapper hw(
    create_file(ph.c_str(), FILE_WRITE_ATTRIBUTES, 
    FILE_SHARE_DELETE | FILE_SHARE_READ | FILE_SHARE_WRITE, 0, 
    OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0)); 
if (hw.handle == INVALID_HANDLE_VALUE) 
    return error_code(::GetLastError(), system_category); 
return error_code(::SetFileTime(hw.handle, 0, 0, &last_write_time) != 0 
    ? 0 : ::GetLastError(), system_category); 
+0

'GetLastError' und' SetFileTime' sind Windows-Funktionen. Ist das auf Linux, Cygwin oder etwas anderes? – leedm777

+0

Linux, wie pro Tag. Ich habe das auch bemerkt, ich dachte Boost reimplementiert sie einfach. Oder vielleicht habe ich die falsche Datei bekommen. Punkt ist, es funktioniert, außer für diese skurrile Erlaubnis Sache. – UncleZeiv

Antwort

1

Ich wette touch -r file directory versagt auch. Dies würde den Zeitstempel von file anstelle der aktuellen Zeit verwenden.

Ich kann keine explizite Dokumentation über das Verhalten finden, aber der zugrunde liegende Aufruf (utime oder utimensat) schlägt fehl, wenn Sie beide eine explizite Zeit festlegen und die Datei, die Sie berühren, nicht besitzen.

$ touch foo 
$ touch bar 
$ sudo chmod a+rw bar 
$ sudo chown root.root bar 
$ touch bar 
# success 
$ touch -r foo bar 
touch: setting times of `bar': Operation not permitted 

Es macht Sinn, wenn man darüber nachdenkt. Wenn Sie eine Schreibberechtigung für die Datei/das Verzeichnis haben, können Sie sie manuell bearbeiten, um die Modifikationszeit zu ändern. Wenn Sie die Modifikationszeit jedoch auf eine andere Zeit einstellen, müssen Sie Eigentümer sein.

+0

Ah ja, das war das fehlende Teil des Puzzles. Vielen Dank! – UncleZeiv

Verwandte Themen