如何使用覆盖执行boost :: filesystem copy_file

Dan*_*eer 44 c++ windows boost boost-filesystem

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

boost::filesystem copy_file函数没有这样的参数,如果目标文件存在则会失败.是否有一种优雅的方式来使用boost copy_file函数并覆盖目标文件?或者仅仅使用Windows API更好吗?我目前的目标平台是Windows,但我更喜欢使用STL并在可能的情况下增强以保持我的代码平台独立.

谢谢.

ann*_*nno 66

copy_file有第三个枚举参数,boost :: filesystem :: copy_option :: overwrite_if_exists

copy_file(source_path,destination_path,copy_option::overwrite_if_exists);
Run Code Online (Sandbox Code Playgroud)

  • 注意:POSIX实现中的第三个参数似乎存在问题.见维塔利的回答. (3认同)
  • @DanivanderMeer为了这个页面的访问者的利益,[该错误已在几年前修复](https://svn.boost.org/trac/boost/ticket/4930). (3认同)

Vit*_*y P 18

请注意带有copy_option :: overwrite_if_exists的boost :: copy_file!如果目标文件存在且小于源,则该函数将仅覆盖目标文件中的第一个大小(from_file)字节.

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

  • 根据提升,这个问题刚刚在rev中修复.67067(所以我预计它将包含在即将推出的升级版1.46中) (9认同)
  • 是的,它是不同的.我刚刚提交了bug来提升.见ISSUE#4930(https://svn.boost.org/trac/boost/ticket/4930) (3认同)

jon*_*son 8

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

if (exists (to_fp))
    remove (to_fp);
copy_file (from_fp, to_fp);
Run Code Online (Sandbox Code Playgroud)

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