2011-04-17 118 views
3

所以...我有一個基本路徑和一個新路徑。新路徑包含它的基本路徑。我需要看看新途徑有什麼不同。就像我們有/ home /和新路徑是/ home/apple/one,我需要從它得到蘋果/一個。注意 - 當我從(homePath/diffPath)創建一些路徑時,我需要再次獲得/ home/apple/one。如何用Boost FileSystem做這樣的事情?如何從另一個路徑中減去一條路徑?

回答

8

使用stem()和parent_path()並從新路徑向後走,直到我們回到基路徑,這可行,但我不確定它是否非常安全。 要謹慎,因爲路徑「/ home」和「/ home /」被視爲不同的路徑。以下僅適用於基本路徑爲/ home(不帶結尾斜線)且新路徑保證位於目錄樹中的基本路徑之下的情況。

#include <iostream> 
#include <boost/filesystem.hpp> 
int main(void) 
{ 
    namespace fs = boost::filesystem; 

    fs::path basepath("/home"); 
    fs::path newpath("/home/apple/one"); 
    fs::path diffpath; 

    fs::path tmppath = newpath; 
    while(tmppath != basepath) { 
    diffpath = tmppath.stem()/diffpath; 
    tmppath = tmppath.parent_path(); 
    } 

    std::cout << "basepath: " << basepath << std::endl; 
    std::cout << "newpath: " << newpath << std::endl; 
    std::cout << "diffpath: " << diffpath << std::endl; 
    std::cout << "basepath/diffpath: " << basepath/diffpath << std::endl; 

    return 0; 
} 
0

其他的解決方案,如果你知道newpath真正屬於basepath,可能是:

auto nit = newpath.begin(); 

for (auto bit = basepath.begin(); bit != basepath.end(); ++bit, ++nit) 
    ; 

fs::path = path(nit, newpath.end()); 
相關問題