boost :: filesystem copy_fileを上書きして実行する方法
-
06-07-2019 - |
質問
Windows API関数 CopyFile
には、ターゲットファイルが存在する場合に上書きするかどうかを制御できる引数 BOOL bFailIfExists
があります。
boost :: filesystem
copy_file
関数にはそのような引数はなく、ターゲットファイルが存在する場合は失敗します。 boost copy_file関数を使用してターゲットファイルを上書きするエレガントな方法はありますか?それとも、単にWindows APIを使用する方が良いでしょうか?私の現在のターゲットプラットフォームはWindowsですが、STLを使用し、可能な限りコードプラットフォームを独立させるためにブーストすることを好みます。
ありがとう。
解決
copy_fileには3番目の enum 引数があり、 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に注意してください! 宛先ファイルが存在し、ソースファイルよりも小さい場合、この関数はターゲットファイルの最初のサイズ(from_file)バイトのみを上書きします。
少なくとも私にとっては、copy_option :: overwrite_if_existsが content
ではなく files に影響を与えると推測していたため、警告でした。最初に宛先ファイルが存在するかどうかをテストし、存在する場合は削除します:
if (exists (to_fp))
remove (to_fp);
copy_file (from_fp, to_fp);
または、テストとコピーの間に表示されるファイルが心配な場合は、一時ファイルに書き込んでから宛先ファイルに名前を変更できます。
boost copy_file関数を使用してターゲットファイルを上書きするエレガントな方法はありますか?
どうやらこれを行うための直接的なAPIはありません。
または、単にWindows APIを使用する方が良いでしょうか?私の現在のターゲットプラットフォームはWindowsですが、STLを使用し、可能な場合はコードプラットフォームを独立させるためにブーストすることを好みます。
ドキュメントから:
技術レポート2にBoost.Filesystemを含めるというN1975の提案は、C ++標準委員会によって承認されました。 Boost.Filesystemライブラリーは、TR2プロセスを通じて機能するため、TR2 Filesystemの提案と整合性を保ちます。ただし、名前空間とヘッダーの粒度はBoost.FilesystemとTR2提案で異なることに注意してください。
boost :: filesystem
に固執することをお勧めします。