如何执行 boost::filesystem copy_file 并覆盖
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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
copy_file 还有第三个 enum 参数,boost::filesystem::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
https://www.boost.org/doc/libs/1_75_0/libs/filesystem/doc/reference.html
小心 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
首先测试目标文件是否存在,如果存在则将其删除:
或者如果您担心测试和副本之间出现该文件,那么您可以写入临时文件,然后将其重命名为目标文件。
Test if the destination file exists first and if it does then remove it :
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.
显然没有直接的 API 可以做到这一点。
从文档中:
这强烈表明坚持使用 boost::filesystem 是一个好主意。
Apparently there's no direct API to do this.
From the documentation:
Which strongly suggests that sticking with
boost::filesystem
is a good idea.