Задача довольно проста, поскольку базовое имя файла - это просто часть строки, начинающаяся с последнего разделителя для папок:
std::string base_filename = path.substr(path.find_last_of("/\\") + 1)
Если расширение также будет удалено, единственное, что нужно сделать, это найти последний .
и взять substr
до этой точки
std::string::size_type const p(base_filename.find_last_of('.'));
std::string file_without_extension = base_filename.substr(0, p);
Возможно, должна быть проверка, чтобы справиться с файлами, состоящими исключительно из расширений (то есть .bashrc
...)
Если вы разделите это на отдельные функции, вы сможете повторно использовать отдельные задачи:
template<class T>
T base_name(T const & path, T const & delims = "/\\")
{
return path.substr(path.find_last_of(delims) + 1);
}
template<class T>
T remove_extension(T const & filename)
{
typename T::size_type const p(filename.find_last_of('.'));
return p > 0 && p != T::npos ? filename.substr(0, p) : filename;
}
Код настроен на возможность использования его с различными std::basic_string
экземплярами (т. Е. std::string
& std::wstring
...)
Недостатком шаблона является требование указать параметр шаблона, если функциям передано const char *
.
Так что вы можете:
A) Используйте только std::string
вместо шаблонов кода
std::string base_name(std::string const & path)
{
return path.substr(path.find_last_of("/\\") + 1);
}
B) Предоставить функцию обертывания, используя std::string
(в качестве промежуточных, которые, вероятно, будут встроены / оптимизированы)
inline std::string string_base_name(std::string const & path)
{
return base_name(path);
}
C) Укажите параметр шаблона при вызове с помощью const char *
.
std::string base = base_name<std::string>("some/path/file.ext");
Результат
std::string filepath = "C:\\MyDirectory\\MyFile.bat";
std::cout << remove_extension(base_name(filepath)) << std::endl;
Печать
MyFile