2009-07-01 6 views
2

J'ai un chemin relatif (par exemple "foo/bar/baz/quux.xml") et je veux supprimer un répertoire pour avoir le sous-répertoire + fichier (par exemple "bar/baz/quux.xml") .Existe-t-il un moyen plus simple de supprimer un répertoire de boost :: filesystem :: path?

Vous pouvez le faire avec des itérateurs de chemin, mais j'espérais qu'il y avait quelque chose qui me manquait dans la documentation ou quelque chose de plus élégant. Voici le code que j'ai utilisé.

#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; 
    } 
} 

La sortie est:

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 

Ce que j'espérais était quelque chose comme:

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

Si vous regardez certains test code on codepad.org, je l'ai essayé branch_path (retours « foo/bar/baz ") et relative_path (renvoie" foo/bar/baz/quux.xml ").

Répondre

3

Voici quelque chose qu'un collègue a trouvé juste en utilisant string::find avec boost::filesystem::slash. J'aime cela qu'il ne nécessite pas de parcourir tout le chemin en le décomposant, mais aussi en utilisant la définition indépendante du système d'exploitation du chemin du caractère de séparation de chemin. Merci 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)); 
    } 
} 
Questions connexes