web-dev-qa-db-ja.com

boost :: filesystem copy_fileを上書きして実行する方法

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

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

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

41

3番目のenum copy_fileへの引数がありますboost :: filesystem :: copy_option :: overwrite_if_exists

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

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

Copy_option :: overwrite_if_existsはfilesに影響し、contentには影響しないと推測したため、少なくとも私にとってはこれは警告でした。

18
Vitaly P

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

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

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

9
jon-hanson

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

どうやらこれを行う直接のAPIはないようです。

または、単にWindows APIを使用する方が良いですか?現在のターゲットプラットフォームはWindowsですが、コードプラットフォームを独立させるために、可能な場合はSTLとブーストを使用することを好みます。

ドキュメントから:

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

これは、boost::filesystemは良い考えです。

2
dirkgently