2009-07-01 58 views
2

我有一個相對路徑(例如「foo/bar/baz/quux.xml」),我想彈出一個目錄,這樣我就可以得到子目錄+文件(例如「bar/baz/quux.xml」) 。是否有更簡單的方法從boost :: filesystem :: path中彈出目錄?

你可以用路徑迭代器做到這一點,但我希望有一些我從文檔或更優雅的東西丟失。以下是我使用的代碼。

#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(返回「富/ bar/baz「)和relative_path(返回」foo/bar/baz/quux.xml「)。

回答

3

這是一件同事想出的僅僅使用string::findboost::filesystem::slash。我喜歡這樣,它不需要遍歷整個路徑,而是使用路徑的與操作系統無關的路徑分隔字符的定義。謝謝Bodgan!

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)); 
    } 
} 
相關問題