【问题标题】:boost::filesystem::rename: Cannot create a file when that file already existsboost::filesystem::rename:当该文件已存在时无法创建该文件
【发布时间】:2011-03-10 13:38:17
【问题描述】:

我正在使用 boost::filesystem 重命名文件,有时目标文件会存在。根据此处的提升文档:

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

模板 无效重命名(常量路径1& from_p,常量 路径2& to_p);要求: 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 上测试过这个,所以不知道那里是否也存在问题。

【问题讨论】:

    标签: c++ boost filesystems


    【解决方案1】:

    看起来它已修复,但仅在沙盒“V3”版本的 Boost.Filesystem 中,尚未在主线 Boost 版本中。

    我在 Linux 上的 Boost 1.43.0 上进行了测试,结果相同 - 事实上,错误报告指出了有问题的代码,它明确检查 POSIX 上是否存在并抛出异常。这可能最初是因为 Windows 上的 MoveFile 表现出相同的行为吗?在沙盒 V3 版本中,重命名将在 Windows 上调用 MoveFileEx,在 POSIX 上调用 std::rename,并允许覆盖现有文件。

    我想您可以通过在调用 boost::filesystem::rename 之前在目标上调用 boost::filesystem::remove 来解决这个问题,具体取决于您的程序是否需要原子操作。

    【讨论】:

    • 谢谢,我没有意识到修复程序并没有推广到更广阔的世界。对于我正在开发的应用程序,我可能会使用删除/重命名,但正如你所说,如果我需要一些原子的东西,我会被塞满。
    • 如果您使用的是旧软件,Boost.Filesystem 的第一个“V3”版本是 1.46.0(参见boost.org/doc/libs/1_70_0/libs/filesystem/doc/…
    猜你喜欢
    • 2012-11-12
    • 1970-01-01
    • 1970-01-01
    • 2020-12-18
    • 2022-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-13
    相关资源
    最近更新 更多