Sim*_*ott 5 c++ filesystems boost
我正在使用boost :: filesystem重命名文件,有时目标文件将存在。根据此处的升压文档:
http://www.boost.org/doc/libs/1_42_0/libs/filesystem/doc/reference.html#Non-member-functions
模板无效重命名(const Path1&from_p,const Path2&to_p); 要求:Path1 :: external_string_type和Path2 :: external_string_type是同一类型。
效果:将from_p重命名为to_p,就像通过POSIX named()一样。
后置条件:!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上测试过它,所以也不知道问题是否也存在。
看起来好像是固定的,但仅在Boost.Filesystem的沙箱“ V3”版本中,而尚未在主线Boost版本中发布。
我在Linux上的Boost 1.43.0上进行了测试,结果相同-实际上,错误报告指出了令人反感的代码,该代码明确检查POSIX上是否存在并引发异常。这可能是最初完成的,因为MoveFile在Windows上表现出相同的行为?在沙盒V3版本中,重命名将MoveFileEx在Windows和std::renamePOSIX上调用,并允许覆盖现有文件。
我想您可以通过boost::filesystem::remove在调用之前调用目标来解决它boost::filesystem::rename,具体取决于您的程序是否需要原子操作。
| 归档时间: |
|
| 查看次数: |
12003 次 |
| 最近记录: |