Класс pathиз библиотеки Boost Filesystem позволяет легко получить с помощью функции-члена path::leafпоследний элемент полного пути, которым может быть имя файла или каталога. В примере 10.22 приводится простая программа, которая использует эту функцию, чтобы показать, к чему относится этот путь: к файлу или к каталогу.
Пример 10.22. Получение имени файла из пути
#include
#include
#include
using namespace std;
using namespace boost::filesystem;
int main(int argc, char** argv) {
// Проверка параметров
try {
path p = complete(path(argv[1], native));
cout << p.leaf() << " is a "
<< (is_directory(p) ? "directory" : "file") << endl;
} catch (exception& e) {
cerr << e.what() << endl;
}
return(EXIT_SUCCESS);
}
См. обсуждение рецепта 10.7, где более детально рассматривается класс path.
Смотри также
Рецепт 10.15.
10.15. Извлечение пути из полного имени файла
Проблема
Имеется полное имя файла (имя файла и путь доступа к нему), например d:\apps\src\foo.с, и требуется получить путь к файлу, d:\apps\src.
Решение
Примените подход, который использовался в предыдущих двух рецептах, и используйте функции rfindи substrдля поиска и получения из полного пути то, что вам нужно. В примере 10.23 приводится короткая программа, показывающая, как это можно сделать.
Пример 10.23. Получение пути из полного имени файла
#include
#include
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 показывает, как можно использовать эту функцию.
Пример 10.24. Получение базового пути
#include
#include
#include
using namespace std;
using namespace boost::filesystem;
int main(int argc, char** argv) {
// Проверка параметров...
try {
path p = complete(path(argv[1], native));
cout << p.branch_path().string() << endl;
} catch (exception& e) {
cerr << e.what() << endl;
}
return(EXIT_SUCCESS);
}
Результат выполнения примера 10.24 может выглядеть следующим образом.
D:\src\ccb\c10>bin\GetPathBoost.exe с:\windows\system32\1033
с:/windows/system32
Смотри также
Рецепты 10.13 и 10.14.
10.16. Замена расширения файла
Проблема
Имеется имя файла (возможно, с путем доступа к нему) и требуется заменить расширение файла. Например, имя файла thesis.texтребуется преобразовать в thesis.txt.
Решение
Используйте функции-члены rfindи replaceкласса stringдля поиска расширения и его замены. Пример 10.25 показывает, как это можно сделать.
Пример 10.25. Замена расширения файла
#include
#include
using std::string;
void replaceExt(string& s, const string& newExt) {
string::size_type i = s.rfind('.', s.length());
if (i != string::npos) {
s.replace(i+1, newExt.length(), newExt);
}
}
int main(int argc, char** argv) {
string path = argv[1];
replaceExt(path, "foobar");
std::cout << "The new name is \"" << path << "\"\n";
}
Обсуждение
Здесь используется подход, аналогичный тому, который применялся в предыдущих рецептах, однако в данном случае я использовал функцию replaceдля замены части строки новой подстрокой. Функция replaceимеет три параметра. Первый параметр задает позицию, в которую вставляется новая подстрока, а второй параметр определяет количество символов, которые необходимо удалить в формируемой строке. Третий параметр — это значение, которое будет использовано для замены удаляемой части строки.
Смотри также
Рецепт 4.9.
10.17. Объединение двух путей в один
Проблема
Имеется два пути и требуется их объединить в один путь. Например, вы имеете в качестве первого пути /usr/home/ryanи в качестве второго — utils/compilers; требуется получить /usr/home/ryan/utils/compilers, причем первый путь может как иметь, так и не иметь в конце разделитель элементов пути.
Читать дальше