Problem
You have the full path of a filename, e.g., d:appssrcfoo.c, and you need to get the pathname, d:appssrc.
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
#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, i));
}
return("");
}
int main(int argc, char** argv) {
string path = argv[1];
std::cout << "The path name is "" << getPathName(path) << ""
";
}
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
#include
#include
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;
}
return(EXIT_SUCCESS);
}
Sample output from Example 10-24 looks like this:
D:srcccbc10>binGetPathBoost.exe c:windowssystem321033 c:/windows/system32
See Also
Recipe 10.13 and Recipe 10.14
Building C++ Applications
Code Organization
Numbers
Strings and Text
Dates and Times
Managing Data with Containers
Algorithms
Classes
Exceptions and Safety
Streams and Files
Science and Mathematics
Multithreading
Internationalization
XML
Miscellaneous
Index