50

Windows API関数には、ターゲットファイルが存在する場合にそれを上書きするかどうかを制御できるCopyFile引数があります。BOOL bFailIfExists

関数にはそのboost::filesystem copy_fileような引数がなく、ターゲットファイルが存在する場合は失敗します。boost copy_file関数を使用してターゲットファイルを上書きするエレガントな方法はありますか?それとも、単にWindows APIを使用する方が良いですか?現在のターゲットプラットフォームはWindowsですが、コードプラットフォームを独立させるために、可能な場合はSTLとブーストを使用することを好みます。

ありがとうございました。

4

4 に答える 4

74

copy_file、 boost::filesystem::copy_option::overwrite_if_existsには 3 番目の列挙型引数があります。

copy_file(source_path, destination_path, copy_option::overwrite_if_exists);

https://www.boost.org/doc/libs/1_75_0/libs/filesystem/doc/reference.html

于 2010-04-26T23:25:39.467 に答える
19

copy_option::overwrite_if_exists を使用した boost::copy_file に注意してください! 宛先ファイルが存在し、それがソースより小さい場合、関数はターゲット ファイルの最初の size(from_file) バイトのみを上書きします。

少なくとも私にとっては、copy_option::overwrite_if_exists がコンテンツではなくファイルに影響すると推測していたので、これは警告でした。

于 2010-11-16T14:32:22.087 に答える
8

宛先ファイルが最初に存在するかどうかをテストし、存在する場合は削除します。

if (exists (to_fp))
    remove (to_fp);
copy_file (from_fp, to_fp);

または、テストとコピーの間にファイルが表示されることが心配な場合は、一時ファイルに書き込んでから、宛先ファイルに名前を変更することができます。

于 2009-05-06T13:17:08.593 に答える
2

ブースト copy_file 関数を使用してターゲット ファイルを上書きするエレガントな方法はありますか?

どうやらこれを行うための直接の API はありません。

それとも、単純に Windows API を使用する方がよいのでしょうか? 現在のターゲット プラットフォームは Windows ですが、可能な限り STL とブーストを使用して、コード プラットフォームに依存しないようにしています。

ドキュメントから:

Boost.Filesystem をテクニカル レポート 2 に含めるという提案 N1975 が、C++ 標準委員会によって承認されました。Boost.Filesystem ライブラリは、TR2 プロセスを通じて機能するため、TR2 ファイルシステムの提案に沿ったままになります。ただし、Boost.Filesystem と TR2 提案では、名前空間とヘッダーの粒度が異なることに注意してください。

boost::filesystemこれは、固執することが良い考えであることを強く示唆しています。

于 2009-05-06T18:06:19.833 に答える