【问题标题】:Is there an easier way to pop off a directory from boost::filesystem::path?有没有更简单的方法从 boost::filesystem::path 弹出目录?
【发布时间】:2009-07-01 17:21:15
【问题描述】:

我有一个相对路径(例如“foo/bar/baz/quux.xml”),我想弹出一个目录,以便我将拥有子目录 + 文件(例如“bar/baz/quux.xml” )。

您可以使用路径迭代器来做到这一点,但我希望文档中缺少一些东西或更优雅的东西。下面是我使用的代码。

#include <boost/filesystem/path.hpp>
#include <boost/filesystem/operations.hpp>
#include <boost/filesystem/convenience.hpp>
#include <boost/filesystem/exception.hpp>

#include <boost/assign.hpp>

boost::filesystem::path pop_directory(const boost::filesystem::path& path)
{
    list<string> parts;
    copy(path.begin(), path.end(), back_inserter(parts));

    if (parts.size() < 2)
    {
        return path;
    }
    else
    {
        boost::filesystem::path pathSub;
        for (list<string>::iterator it = ++parts.begin(); it != parts.end(); ++it)
        {
            pathSub /= *it;
        }
        return pathSub;
    }
}

int main(int argc, char* argv)
{
  list<string> test = boost::assign::list_of("foo/bar/baz/quux.xml")
  ("quux.xml")("foo/bar.xml")("./foo/bar.xml");
  for (list<string>::iterator i = test.begin(); i != test.end(); ++i)
  {
    boost::filesystem::path p(*i);
    cout << "Input: " << p.native_file_string() << endl;

    boost::filesystem::path p2(pop_directory(p));

    cout << "Subdir Path: " << p2.native_file_string() << endl;
  }
}

输出是:

Input: foo/bar/baz/quux.xml 
Subdir Path: bar/baz/quux.xml
Input: quux.xml
Subdir Path: quux.xml 
Input: foo/bar.xml 
Subdir Path: bar.xml
Input: ./foo/bar.xml 
Subdir Path: foo/bar.xml

我希望是这样的:

boost::filesystem::path p1(someString);
boost::filesystem::path p2(p2.pop());

如果您查看一些 test code on codepad.org,我尝试了 branch_path(返回“foo/bar/baz”)和 relative_path(返回“foo/bar/baz/quux.xml”)。

【问题讨论】:

    标签: c++ path boost-filesystem


    【解决方案1】:

    这是一位同事在使用string::findboost::filesystem::slash 时发现的。我喜欢这样,它不需要遍历整个路径来分解它,而且还使用路径的独立于操作系统的路径分隔字符定义。谢谢博德根!

    boost::filesystem::path pop_front_directory(const boost::filesystem::path& path)
    {
        string::size_type pos = path.string().find(boost::filesystem::slash<boost::filesystem::path>::value);
        if (pos == string::npos)
        {
            return path;
        }
        else
        {
            return boost::filesystem::path(path.string().substr(pos+1));
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2016-06-02
      • 1970-01-01
      • 2012-07-06
      • 1970-01-01
      • 1970-01-01
      • 2011-01-24
      • 2011-04-23
      • 2018-02-18
      • 1970-01-01
      相关资源
      最近更新 更多