2011-07-13 60 views
1

我想將文件複製到另一個文件,我想使用Boost :: copy_file。它有一個叫做paramether其中copy_option可以:boost :: copy_file copy_option跳過現有的目標文件?

BOOST_SCOPED_ENUM_START(copy_option) 
    {none, fail_if_exists = none, overwrite_if_exists}; 
    BOOST_SCOPED_ENUM_END 

我已經找到關於overwrite_if_exists行爲在這裏另外一個問題:how to perform boost::filesystem copy_file with overwrite

但我的問題是,我不知道如何使用fail_if_exists = none選項。我想跳過複製操作,如果目標文件已經存在。

我知道它可能與if (!exists(path))但我想了解copy_option如何工作。

如何在Boost :: copy_file函數中使用fail_if_exists = none

更新:更正了代碼,the one on boost doc website是一種破碎。

+0

我的Boost版本在那裏沒有'none'。你正在使用哪個版本?在您發佈的代碼中'none'之後應該有一個逗號。 – interjay

+0

你是可靠的,文檔中的一個是壞的。 – zsero

回答

2

沒有copy_option只跳過副本,如果目標已經存在。

但是​​也不是正確的答案,因爲競爭條件:文件可能會在您執行存在檢查的時間和您嘗試複製的時間之間創建。所以即使你檢查文件的存在,copy_file可能會失敗。

綜合你想要的就是捕捉錯誤並自己忽略它。就像這樣:

try { 
    copy_file(...); 
} 
catch (const boost::system::system_error &err) { 
    if (!err.code().equivalent(boost::system::errc::file_exists)) 
     throw; 
} 
+0

似乎相當低效,以促進例外正常工作流程..使用變體返回error_code可能會更好 – Paladin

0

這又回到了this proposal爲了讓一個老作用域,枚舉黑客的平滑過渡到清理的C++ 0x-枚舉類:

namespace FooEnum { 
    enum type { 
     SomeValue 
    } 
} 

用戶可以接着寫FooEnum::SomeValue和值名稱衝突被避免。 C++ 0x將有本地支持。

所以,你只用<enum-name>::<enum-value>,即copy_option::none

相關問題