50

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

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

谢谢你。

4

4 回答 4

74

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

于 2010-04-26T23:25:39.467 回答
19

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

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

于 2010-11-16T14:32:22.087 回答
8

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

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

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

于 2009-05-06T13:17:08.593 回答
2

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

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

还是简单地使用 Windows API 更好?我目前的目标平台是 Windows,但我更喜欢使用 STL 并尽可能使用 boost 来保持我的代码平台独立。

从文档中:

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

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

于 2009-05-06T18:06:19.833 回答