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

时间:2009-05-06 13:07:54

标签: c++ windows boost boost-filesystem

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

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

谢谢。

4 个答案:

答案 0 :(得分:60)

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

copy_file(source_path,destination_path,copy_option::overwrite_if_exists);

答案 1 :(得分:18)

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

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

答案 2 :(得分:9)

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

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

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

答案 3 :(得分:2)

  

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

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

  

或者仅仅使用Windows API更好吗?我目前的目标平台是Windows,但我更喜欢使用STL并尽可能提高我的代码平台独立性。

来自文档:

  

C ++标准委员会已接受将技术报告2中包含Boost.Filesystem的提案N1975。 Boost.Filesystem库将与TR2文件系统提案保持一致,因为它通过TR2进程。但请注意,Boost.Filesystem和TR2提案之间的命名空间和标头粒度不同。

强烈建议坚持boost::filesystem是一个好主意。