std::cout << "The extension is \"" << getFileExt(path) << "\"\n";
}
Обсуждение
Для получения расширения из имени файла достаточно лишь найти позицию последней точки «.» и выделить все, что находится справа от нее. Стандартный класс
string
, определенный в
<string>
, содержит функции, которые могут выполнить обе эти операции:
rfind
и
substr
.
rfind
выполнит поиск (в обратном направлении) того, что вы передаете ей в первом аргументе (символ типа
char
в данном случае), начиная с позиции, указанной вторым аргументом, и возвращает позицию, в которой найден указанный объект. Если поиск завершился неудачей,
rfind
возвратит
string::npos
. Функция
substr
также имеет два аргумента. Первый аргумент содержит позицию первого копируемого элемента, а второй аргумент — количество копируемых символов.
Стандартный класс строки содержит несколько функций-членов, выполняющих поиск. См. рецепт 4.9, в котором более детально обсуждается поиск строк.
Смотри также
Рецепты 4.9 и 10.12.
10.14. Извлечение имени файла из полного пути
Проблема
Имеется полный путь к файлу, например d:\apps\src\foo.с, и требуется получить имя файлa, foo.с.
Решение
Примените подход, который использовался в предыдущем рецепте, и используйте функции
rfind
и
substr
для поиска и получения из полного пути то, что вам нужно. Пример 10.21 показывает, как это можно сделать.
Пример 10.21. Извлечение имени файла из полного пути
#include <iostream>
#include <string>
using std::string;
string getFileName(const string& s) {
char sep = '/';
#ifdef _WIN32
sep = '\\';
#endif
size_t i = s.rfind(sep.s.length);
if (i ! = string::npos) {
return(s.substr(i+1, s.length - i));
}
return("");
}
int main(int argc, char** argv) {
string path = argv[1];
std::cout << "The file name is \"" << getFileName(path) << "\"\n";
}
Обсуждение
См. предыдущий рецепт, в котором приводится детальное описание функций
rfind
и
substr
. Стоит отметить только то, что вы уже, по-видимому, заметили в примере 10.21: в Windows в качестве разделителя используется обратный слеш вместо прямого, поэтому я добавил оператор
#ifdef
для установки требуемого разделителя элементов пути.
Класс
path
из библиотеки Boost Filesystem позволяет легко получить с помощью функции-члена
path::leaf
последний элемент полного пути, которым может быть имя файла или каталога. В примере 10.22 приводится
простая программа, которая использует эту функцию, чтобы показать, к чему относится этот путь: к файлу или к каталогу.
См. обсуждение рецепта 10.7, где более детально рассматривается класс
path
.
Смотри также
Рецепт 10.15.
10.15. Извлечение пути из полного имени файла
Проблема
Имеется полное имя файла (имя файла и путь доступа к нему), например
d:\apps\src\foo.с
, и требуется получить путь к файлу,
d:\apps\src
.
Решение
Примените подход, который использовался в предыдущих двух рецептах, и используйте функции
rfind
и
substr
для поиска и получения из полного пути то, что вам нужно. В примере 10.23 приводится короткая программа, показывающая, как это можно сделать.
Пример 10.23. Получение пути из полного имени файла
#include <iostream>
#include <string>
using std::string;
string getPathName(const string& s) {
char sep = '/';
#ifdef _WIN32
sep = '\\';
#endif
size_t i = s.rfind(sep, s.length);
if (i != string::npos) {
return(s.substr(0, !));
}
return("");
}
int main(int argc, char** argv) {
string path = argv[1];
std::cout << "The path name is \"" << getPathName(path) << "\"\n";
}
Обсуждение
Пример 10.23 тривиален, особенно если вы уже знакомы с двумя предыдущими рецептами, поэтому дополнительные пояснения не требуются. Однако, как и во многих других рецептах, библиотека Boost Filesystem позволяет извлекать с помощью функции
branch_path
все, что угодно, кроме последней части имени файла. Пример 10.24 показывает, как можно использовать эту функцию.