Windows API関数CopyFile
には引数BOOL bFailIfExists
を使用すると、ターゲットファイルが存在する場合に、そのファイルを上書きするかどうかを制御できます。
boost::filesystem
copy_file
関数にはそのような引数はなく、ターゲットファイルが存在する場合は失敗します。 boost copy_file関数を使用してターゲットファイルを上書きするエレガントな方法はありますか?または、単にWindows APIを使用する方が良いですか?現在のターゲットプラットフォームはWindowsですが、コードプラットフォームを独立させるために、可能な場合はSTLとブーストを使用することを好みます。
ありがとうございました。
3番目のenum copy_fileへの引数がありますboost :: filesystem :: copy_option :: overwrite_if_exists
copy_file(source_path,destination_path,copy_option::overwrite_if_exists);
Copy_option :: overwrite_if_existsを指定したboost :: copy_fileに注意してください!宛先ファイルが存在し、それがソースよりも小さい場合、関数はターゲットファイルの最初のsize(from_file)バイトのみを上書きします。
Copy_option :: overwrite_if_existsはfilesに影響し、contentには影響しないと推測したため、少なくとも私にとってはこれは警告でした。
宛先ファイルが最初に存在するかどうかをテストし、存在する場合はそれを削除します。
if (exists (to_fp))
remove (to_fp);
copy_file (from_fp, to_fp);
または、テストとコピーの間にファイルが表示されることを心配している場合は、一時ファイルに書き込み、そのファイルの名前を宛先ファイルに変更できます。
Boost copy_file関数を使用してターゲットファイルを上書きするエレガントな方法はありますか?
どうやらこれを行う直接のAPIはないようです。
または、単にWindows APIを使用する方が良いですか?現在のターゲットプラットフォームはWindowsですが、コードプラットフォームを独立させるために、可能な場合はSTLとブーストを使用することを好みます。
ドキュメントから:
Boost.Filesystemをテクニカルレポート2に含めるというN1975の提案は、C++標準委員会によって承認されました。 Boost.Filesystemライブラリは、TR2プロセスを通じて機能するため、TR2ファイルシステムの提案に沿った状態を保ちます。ただし、Boost.FilesystemとTR2の提案では、名前空間とヘッダーの粒度が異なることに注意してください。
これは、boost::filesystem
は良い考えです。