質問

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 に固執することをお勧めします。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top