1

ファイルを別のファイルにコピーしたいのですが、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 = noneBoost::copy_file 関数内でどのように使用できますか?

更新: コードを修正しました。boost doc Web サイトのコードは壊れています。

4

2 に答える 2

2

copy_option宛先がすでに存在する場合は、コピーをスキップする必要はありません。

ただしif (!exists(path)) copy_file(...)、競合状態のため、正しい答えでもありません。存在チェックを実行してからコピーを試行するまでの間にファイルが作成される可能性があります。そのため、ファイルの存在を確認してもcopy_file失敗する可能性があります。

必要なものを合成する方法は、エラーをキャッチして自分で無視することです。このようなもの:

try {
    copy_file(...);
}
catch (const boost::system::system_error &err) {
    if (!err.code().equivalent(boost::system::errc::file_exists))
        throw;
}
于 2011-07-13T15:10:39.607 に答える
0

これは、古いscoped-enum-hackからclean-c ++ 0x-enum-classesへのスムーズな移行を可能にするために、この提案に戻ります。

 namespace FooEnum {
     enum type {
         SomeValue
     }
 }

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

だから、あなたはただ<enum-name>::<enum-value>、すなわちcopy_option::noneなどを使うでしょう。

于 2011-07-13T14:54:51.580 に答える