boost :: filesystem :: rename:当该文件已存在时,无法创建文件

时间:2010-07-01 10:15:04

标签: c++ boost filesystems

我正在使用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上测试过,所以不知道问题是否存在。

1 个答案:

答案 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来解决它,具体取决于你的程序是否需要原子操作。