我正在使用boost :: filesystem重命名文件,有时目标文件将存在。根据此处的提升文档:
http://www.boost.org/doc/libs/1_42_0/libs/filesystem/doc/reference.html#Non-member-functions
模板 void rename(const Path1& from_p,const 路径2&安培;最佳);要求: Path1 :: external_string_type和 Path2 :: external_string_type是 同类型。
效果:将from_p重命名为to_p,就好像 通过POSIX重命名()。
后置条件:!exists(from_p)&& 存在(to_p),内容和 最初的文件属性 名为from_p的名称不变。
[注意:如果from_p和to_p解析为 同一个文件,不采取任何行动。 否则,如果to_p解析为 现有文件,已删除。一个 符号链接本身已重命名, 而不是它解析的文件 被重命名。 - 结束说明]
(我的重点)
在XP SP3上测试通过MS Visual Studio 2008编译的此代码时,重命名会抛出boost :: filesystem :: filesystem_error并显示以下消息:
当该文件已存在时无法创建文件
我注意到这是在错误报告中提出的: https://svn.boost.org/trac/boost/ticket/2866
...但声称在Boost 1.41.0中被关闭,而我正在使用Boost 1.42.0。
我在这里做错了什么,或者我应该恢复到std :: rename?
我还没有在Linux上测试过,所以不知道问题是否存在。
答案 0 :(得分:4)
看起来它已修复,但仅限于Boost.Filesystem的沙盒“V3”版本,该版本尚未出现在主流Boost版本中。
我在Linux上使用Boost 1.43.0测试了相同的结果 - 事实上,错误报告指出了违规代码,它明确地检查POSIX上是否存在并抛出异常。这可能是最初完成的,因为Windows上的MoveFile
表现出相同的行为?在沙盒V3版本中,重命名将在Windows上调用MoveFileEx
,在POSIX调用std::rename
,并允许覆盖现有文件。
我想你可以通过在调用boost::filesystem::remove
之前调用目标上的boost::filesystem::rename
来解决它,具体取决于你的程序是否需要原子操作。