【问题标题】:Boost Property Tree with filename as key以文件名为键提升属性树
【发布时间】:2009-12-22 19:56:39
【问题描述】:

我正在尝试使用文件名作为boost::PropertyTree 中的键

但是,'.'文件名中的字符(例如“example.txt”)会导致在属性树中添加一个附加层。最明显的解决方案是替换 '.'使用另一个字符,但可能有更好的方法来执行此操作,例如使用转义字符。

在下面的示例中,值 10 将被放入节点 'txt',它是 'example' 的子节点。相反,我希望将值 10 存储在节点“example.txt”中。

ptree pt;
pt.put("example.txt", 10);

如何为单个节点使用完整的文件名?

提前感谢您的帮助!

【问题讨论】:

  • 顺便说一句:使用文件名作为键是很棘手的。您是否考虑过存在硬链接时会发生什么?符号链接?在您的进程之外发生的重命名? Windows 上不区分大小写? Windows 会截断文件名中的尾随空格这一事实?
  • 幸运的是,这是一个只读操作,前提是在此操作期间目录的内容不会改变。不过,感谢您指出其他问题。
  • 我的观点是,其中一些事情(如链接的存在)可能会导致误报。只是要记住一些事情,特别是如果您要将其用于某种安全功能。

标签: c++ boost boost-propertytree


【解决方案1】:

只需显式插入树:

pt.push_back(ptree::value_type("example.txt", ptree(10)));

put 方法只是为了方便而存在,这就是它自动将. 解析为附加层的原因。像我上面展示的那样显式地构造 value_type 可以避免这个问题。

解决问题的另一种方法是在putget 中使用一个额外的参数,这会改变分隔符。

pt.put('/', "example.txt", "10");
pt.get<string>('/', "example.txt");

郑重声明,我这辈子从来没有用过这个类。我从您链接到的页面获得了所有这些信息; )

【讨论】:

  • 你这行的小错误,应该是pt.push_back(ptree::value_type("example.txt", ptree("10")));这也引出了一个问题,既然 get 操作也由于 '.' 而失败,我该如何得到这个孩子。字符,如果不给它一个数据值,例如 example.txt>wordCount>10,我该如何输入?
  • 编辑我的帖子来回答你的问题。
  • 很遗憾,put 不支持备用分隔符。所以 pt.put('/', "example.txt", "10");不能使用。虽然我确实替换了“。”在函数之外使用另一个角色,它看起来不像是内置的。
【解决方案2】:

问题在于文档已过时。路径类型对象必须按如下方式创建,另外一个对文件路径无效的字符指定为分隔符如下:

pt.put(boost::property_tree::ptree::path_type("example.txt", '|'), 10);

我在 Philippe Vaucher 发布的新闻组 gmane.comp.lib.boost.devel 的 boost 邮件列表中找到了解决方案的路径。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-26
    • 2011-06-02
    • 1970-01-01
    相关资源
    最近更新 更多