10.15. Extracting a Path from a Full Path and Filename
Problem
You have the full path of a filename, e.g., d:\apps\src\foo.c, and you need to get the pathname, d:\apps\src.
Solution
Use the same technique as the previous two recipes by invoking rfind and substr to find
and get what you want from the full pathname. See Example 10-23 for a short sample
program.
Example 10-23. Get the path from a full path and filename
#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, i));
}
return("");
}
int main(int argc, char** argv) {
string path = argv[1];
std::cout << "The path name is \"" << getPathName(path) << "\"\n";
}Discussion
Example 10-23 is trivial, especially
if you’ve already looked at the previous few recipes, so there is no more to explain.
However, as with many of the other recipes, the Boost Filesystem library provides a way to
extract everything but the last part of the filename with its branch_path function. Example
10-24 shows how to use it.
Example 10-24. Getting the base path
#include <iostream> #include <cstdlib> #include <boost/filesystem/operations.hpp> using namespace std; using namespace boost::filesystem; int main(int argc, char** argv) { // Parameter checking... try { path p = complete(path(argv[1], native)); cout << p.branch_path().string() << endl; } catch (exception& e) { cerr << e.what() << endl; } ...Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access