2010-07-01 608 views
3

我正在使用boost :: filesystem重命名一个文件,有时目标文件将存在。根据Boost文档浏览:boost :: filesystem :: rename:当文件已经存在时无法创建文件

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 rename()中的 一样。

后置条件:存在(from_p)& & 存在(to_p),以及内容和文件的属性 最初 命名from_p在其他方面不变。

[注意:如果from_p和to_p解析为 相同的文件,则不采取任何操作。 否则,如果to_p解析为 现有文件,则将其删除。 A 符号链接本身已重命名为 ,而不是其解析为 的文件被重命名。 - 注完]

(我的重点)

当测试这个代码通过MS Visual Studio 2008中的XP SP3编译,重命名抛出的boost ::与消息文件系统:: filesystem_error:

当该文件已存在

无法创建一个文件,我注意到这已经提出bug报告: https://svn.boost.org/trac/boost/ticket/2866

...但是C针对索赔在Boost 1.41.0被关闭,我使用升压1.42.0。

我在这里做错了什么,或者我应该只是恢复为std :: rename?

我没有测试过这在Linux上又是那么不知道是不是这个问题有太多的存在。

回答

3

看起来好像是固定的,但只有在沙箱“V3” Boost.Filesystem的版本,这是不是在主线加速释放呢。

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

我想你可以通过在调用boost::filesystem::rename之前调用目标boost::filesystem::remove来解决它,这取决于你的程序是否需要操作为原子操作。

+1

谢谢,我还没有意识到修复并未向更广泛的世界发出。 对于我正在开发的应用程序,我可能会使用删除/重命名,但正如你所说,如果我需要一些原子,我会被塞满。 – 2010-07-01 13:34:40

相关问题