Есть ли более простой способ удалить каталог из boost:: filesystem:: path?
У меня есть относительный путь (например, " 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());
Если вы посмотрите на некоторый тестовый код на codepad.org , я попробовал branch_path (возвращает "foo / bar/baz") и relative_path (возвращает " foo/bar/baz/quux.XML").
1 ответ:
Вот то, что сотрудник понял, просто используя
string::find
сboost::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)); } }