2011-07-13 11 views
1

私はファイルを他の人にコピーしたいと思います。私はBoost :: copy_fileを使いたいと思います。それはすることができcopy_optionと呼ばれるparametherがあります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です。

fail_if_exists = noneをBoost :: copy_file関数内で使用するにはどうすればよいですか?

更新:コードを修正しました。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

これは、古いきれい-Cに++ 0xの-列挙 - クラススコープ-列挙型は、ハックのスムーズな移行を可能にするために戻ってthis proposalに行く:

namespace FooEnum { 
    enum type { 
     SomeValue 
    } 
} 

ユーザーは、その後FooEnum::SomeValueと値を書くことができます名前の衝突が回避されました。 C++ 0xはこれをネイティブにサポートします。

ので、あなただけの<enum-name>::<enum-value>を使用することになり、すなわちcopy_option::noneなど

関連する問題