10.17. Combining Two Paths into a Single Path
Problem
You have two paths and you have
to combine them into a single path. You may have something like /usr/home/ryan as a first path, and utils/compilers as the second, and wish to get /usr/home/ryan/utils/compilers, without having to worry whether or not the
first path ends with a path separator.
Solution
Treat the paths as strings and use the append operator, operator+=, to compose a full path out of partial paths. See Example 10-26.
Example 10-26. Combining paths
#include <iostream>
#include <string>
using std::string;
string pathAppend(const string& p1, const string& p2) {
char sep = '/';
string tmp = p1;
#ifdef _WIN32
sep = '\\';
#endif
if (p1[p1.length()] != sep) { // Need to add a
tmp += sep; // path separator
return(tmp + p2);
}
else
return(p1 + p2);
}
int main(int argc, char** argv) {
string path = argv[1];
std::cout << "Appending somedir\\anotherdir is \""
<< pathAppend(path, "somedir\\anotherdir") << "\"\n";
}Discussion
The code in Example 10-26 uses strings that represent paths, but there’s no additional checking on the path class for validity and the paths used are only as portable as the values they contain. If, for example, these paths are retrieved from the user, you don’t know if they’re using the right OS-specific format, or if they contain illegal characters.
For many other recipes in this chapter I have included examples that use the Boost Filesystem library, and when working with paths, this approach has lots of benefits. ...