【问题标题】:How to remove '../' tokens from a file path using the Visual Studio 2012 <filesystem> classes?如何使用 Visual Studio 2012 <filesystem> 类从文件路径中删除“../”标记?
【发布时间】:2014-02-19 12:07:04
【问题描述】:

我有一个像这样的文件路径 "C:/Documents/Music/Jazz/../../Pictures/picture.jpg"

我需要删除“../”标记并将原始文件路径转换为"C:/Documents/Pictures/picture.jpg"

如何使用 Visual Studio 2012(或 2013)标头中的类来做到这一点?

【问题讨论】:

  • C++11标准文件系统库是从什么时候开始的?
  • 什么?它在哪里?
  • 对不起,这是我的错。实际上,Visual Studio 2012 和 Visual Studio 2013 提供的 标头并没有成为 C++ 标准的一部分。然后我将编辑问题。
  • 没关系,但重要的是要知道我们是在谈论boost::filesystem v2 还是 v3,因为标准可能基于 v3,而 VS 的标头基于 v2。跨度>
  • 由于我指的是 VS 2012 标头,我们正在谈论 boost::filesystem v2

标签: c++ c++11 filepath


【解决方案1】:

C++11 没有文件系统库。这被考虑用于C++14 or C++17 标准。

Boost 有一个文件系统 api,boost:filesystem:path 是您可能想要查看的。

【讨论】:

  • 看来他想要的是boost::filesystem::canonical(boost::filesystem::path("C:\path\..\here\is\..\")); 或在C++17 中std::filesystem::canonical(boost::filesystem::path("C:\path\..\here\is\..\")); 生成的path 对象已重载转换为字符串。
  • 伟大的发现,PeterT!但是,我想找到一种方法来完成任务而无需提升。
  • @DmitrySapelnikov 为什么不能从 std::string 中擦除?
【解决方案2】:

C++ 11 没有文件系统库。

但是它确实有一个算法库和字符串库可以为你工作。

【讨论】:

    【解决方案3】:

    C++11 不包含文件系统库。您可以使用std::string 提供的标准工具来处理您的路径:

    std::string s("C:/Documents/Music/Jazz/../../Pictures/picture.jpg");
    size_t t;
    while ( (t = s.find( "/..")) != std::string::npos) {
        s.erase( t, 3);
    }
    if ( (t = s.find( "/Music/Jazz")) != std::string::npos) {
        s.erase( t, 11);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-23
      • 2013-01-06
      • 1970-01-01
      • 1970-01-01
      • 2017-10-03
      • 1970-01-01
      • 2014-04-07
      • 1970-01-01
      相关资源
      最近更新 更多