代码之家  ›  专栏  ›  技术社区  ›  Simon Elliott

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

  •  4
  • Simon Elliott  · 技术社区  · 14 年前

    我正在使用boost::filesystem重命名一个文件,有时目标文件会存在。根据这里的Boost文档:

    http://www.boost.org/doc/libs/1_42_0/libs/filesystem/doc/reference.html#Non-member-functions

    模板 void重命名(const path1&from_p,const 路径2&to_p;要求: 路径1::外部字符串类型和 path2::external_string_类型是 相同类型。

    效果:从“p”重命名为“p”,就好像 按posix重命名()。

    后置条件:!存在(来源于&u p)&& 存在,内容和 文件的原始属性 从_p命名,否则将保持不变。

    [注:如果从\p到\p决定 同一个文件,不执行任何操作。 否则, 如果要解决 现有文件,已删除 . 一 符号链接本身被重命名, 而不是它解析为的文件 被重命名。-结束音符

    (我的重点)

    在xp sp3上测试通过MS Visual Studio 2008编译的此代码时,rename将引发boost::filesystem::filesystem_错误,并显示以下消息:

    当文件已存在时无法创建文件

    我注意到这是在一个错误报告中提出的: https://svn.boost.org/trac/boost/ticket/2866

    …但声称在Boost1.41.0中关闭,我使用的是Boost1.42.0。

    我在这里做了什么错误的事情,还是应该恢复到std::rename?

    我还没有在Linux上测试过这个,所以不知道问题是否也存在。

    1 回复  |  直到 14 年前
        1
  •  4
  •   bjlaub    14 年前

    看起来已经修复了,但只在boost.filesystem的sandbox“v3”版本中修复了,该版本还没有发布在主线boost中。

    我在Linux上的Boost1.43.0上测试了相同的结果——事实上,bug报告指出了有问题的代码,它明确地检查了posix上是否存在,并抛出了异常。这可能是因为 MoveFile 在Windows上表现出相同的行为?在Sandbox v3版本中,Rename将调用 MoveFileEx 在Windows和 std::rename 并允许覆盖现有文件。

    我想你可以打电话来解决这个问题 boost::filesystem::remove 在呼叫前到达目标 boost::filesystem::rename ,取决于程序是否需要原子操作。