如何执行 boost::filesystem copy_file 并覆盖

发布于 2024-07-18 12:16:34 字数 327 浏览 12 评论 0原文

Windows API 函数CopyFile 有一个参数BOOL bFailIfExists,允许您控制是否要覆盖目标文件(如果存在)。

boost::filesystem copy_file 函数没有这样的参数,如果目标文件存在就会失败。 有没有一种优雅的方法来使用 boost copy_file 函数并覆盖目标文件? 还是直接使用 Windows API 更好? 我当前的目标平台是 Windows,但我更喜欢尽可能使用 STL 和 boost,以保持我的代码平台独立。

谢谢。

The Windows API function CopyFile has an argument BOOL bFailIfExists that allows you to control whether or not you want to overwrite the target file if it exists.

The boost::filesystem copy_file function has no such argument, and will fail if the target file exists. Is there an elegant way to use the boost copy_file function and overwrite the target file? Or is it better to simply use the Windows API? My current target platform is Windows, but I prefer to use STL and boost where possible to keep my code platform independent.

Thank you.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

树深时见影 2024-07-25 12:16:34

copy_file 还有第三个 enum 参数,boost::filesystem::copy_option::overwrite_if_exists

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

There's a third enum argument to copy_file, boost::filesystem::copy_option::overwrite_if_exists

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

飘逸的'云 2024-07-25 12:16:34

小心 boost::copy_file 和 copy_option::overwrite_if_exists!
如果目标文件存在并且小于源文件,则该函数将仅覆盖目标文件中的第一个 size(from_file) 字节。

至少对我来说这是一个警告,因为我认为 copy_option::overwrite_if_exists 影响文件而不是内容

Beware of boost::copy_file with copy_option::overwrite_if_exists!
If the destination file exists and it is smaller than the source, the function will only overwrite the first size(from_file) bytes in the target file.

At least for me this was a caveat since I presumed copy_option::overwrite_if_exists affects files and not content

怼怹恏 2024-07-25 12:16:34

首先测试目标文件是否存在,如果存在则将其删除:

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

或者如果您担心测试和副本之间出现该文件,那么您可以写入临时文件,然后将其重命名为目标文件。

Test if the destination file exists first and if it does then remove it :

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

Or if you're worried about the file appearing between the test and the copy then you could write to a temporary file and then rename it to the destination file.

葬心 2024-07-25 12:16:34

是否有一种优雅的方式来使用 boost copy_file 函数并覆盖目标文件?

显然没有直接的 API 可以做到这一点。

还是直接使用 Windows API 更好? 我当前的目标平台是 Windows,但我更喜欢尽可能使用 STL 和 boost,以保持我的代码平台独立。

从文档中:

C++ 标准委员会已接受将 Boost.Filesystem 纳入技术报告 2 的提案 N1975。 Boost.Filesystem 库在完成 TR2 流程时将与 TR2 文件系统提案保持一致。 但请注意,Boost.Filesystem 和 TR2 提案之间的命名空间和标头粒度有所不同。

这强烈表明坚持使用 boost::filesystem 是一个好主意。

Is there an elegant way to use the boost copy_file function and overwrite the target file?

Apparently there's no direct API to do this.

Or is it better to simply use the Windows API? My current target platform is Windows, but I prefer to use STL and boost where possible to keep my code platform independent.

From the documentation:

A proposal, N1975, to include Boost.Filesystem in Technical Report 2 has been accepted by the C++ Standards Committee. The Boost.Filesystem library will stay in alignment with the TR2 Filesystem proposal as it works its way through the TR2 process. Note, however, that namespaces and header granularity differs between Boost.Filesystem and the TR2 proposal.

Which strongly suggests that sticking with boost::filesystem is a good idea.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文