C'è un modo più semplice per far apparire fuori una directory da boost :: filesystem :: percorso?

StackOverflow https://stackoverflow.com/questions/1070333

  •  21-08-2019
  •  | 
  •  

Domanda

Ho un percorso relativo (ad esempio "foo / bar / baz / quux.xml") e voglio pop una directory fuori in modo che avrò la sottodirectory + del file (ad esempio "bar / baz / quux.xml" ).

Si può fare questo con iteratori percorso, ma speravo ci fosse qualcosa che mancava dalla documentazione o qualcosa di più elegante. Di seguito è riportato il codice che ho usato.

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

L'output è:

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

Quello che speravo in era qualcosa di simile:

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

Se si guarda ad alcuni su codepad.org , ho provato branch_path (restituisce "foo / bar / baz ") e RELATIVE_PATH (restituisce "foo / bar / baz / quux.xml").

È stato utile?

Soluzione

Qui c'è qualcosa che un collaboratore capito usando solo string::find con boost::filesystem::slash. Mi piace questo che non richiede iterate su tutto il percorso di rottura in su, ma anche utilizzando la definizione indipendente dal sistema operativo del percorso del carattere di separazione percorso. Grazie 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));
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top