2012-04-12 173 views
1

這個簡單的代碼:需要哪些權限才能成功執行boost :: filesystem :: last_write_time?

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

引發「操作不允許」異常,如果是directory由比一個執行代碼以外的用戶所擁有的路徑。

我有點困惑,因爲我正在處理具有777rwxrwxrwx權限的目錄,並且我可以通過在shell中使用touch來輕鬆更改它們的修改時間。

我錯過了什麼嗎? 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'和'SetFileTime'是Windows函數。這是Linux,Cygwin還是其他?根據標記,可以使用linux, – leedm777 2012-04-12 14:29:23

+0

。我注意到,我只是認爲Boost重新實現了它們。或者,也許我得到了錯誤的文件。要點是,它確實有效,除了那個古怪的許可之外。 – UncleZeiv 2012-04-12 17:28:01

回答

1

我敢打賭touch -r file directory也會失敗。這將使用時間戳file而不是當前時間。

我無法找到有關行爲的明確文檔,但如果您既設置了明確的時間,也沒有擁有正在觸摸的文件,則潛在調用(utimeutimensat)會失敗。

$ 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 

如果你考慮一下,這是有道理的。如果您擁有對文件/目錄的寫入權限,那麼您可以手動編輯以修改修改時間。但是將修改時間設置爲其他時間需要擁有權。

+0

啊,是的,這是拼圖的缺失部分。謝謝! – UncleZeiv 2012-04-13 10:50:00

相關問題