Очень простое кроссплатформенное решение (адаптировано из этого примера для string::find_last_of
):
std::string GetDirectory (const std::string& path)
{
size_t found = path.find_last_of("/\\");
return(path.substr(0, found));
}
Это работает в обоих случаях, когда косая черта может быть либо обратной, либопрямое указание (или смешанное), поскольку оно просто ищет последнее вхождение либо в строке path
.
Однако, мое личное предпочтение - использовать библиотеки Boost :: Filesystem для обработки подобных операций.Пример:
std::string GetDirectory (const std::string& path)
{
boost::filesystem::path p(path);
return(p.parent_path().string());
}
Хотя, если вам нужна единственная функциональность, получение пути к каталогу из строки, тогда Boost может быть немного излишним (особенно, если Boost :: Filesystem - одна из немногих библиотек Boost).это не только заголовки).Тем не менее, AFIK, Boost :: Filesystem был одобрен для включения в стандарт TR2, но может не быть полностью доступным до стандарта C ++ 14 или C ++ 17 (вероятно, последний, основанный на этот ответ ), поэтому, в зависимости от вашего компилятора (и когда вы читаете это), вам может даже не потребоваться компилировать их отдельно, поскольку они могут уже быть включены в вашу систему.Например, Visual Studio 2012 уже может использовать некоторые компоненты файловой системы TR2 (согласно в этом посте ), хотя я не пробовал, поскольку я все еще использую Visual Studio 2010 ...