10.14. Extracting a Filename from a Full Path
Problem
You have the full path of a filename, e.g., d:\apps\src\foo.c, and you need to get the filename, foo.c.
Solution
Employ the same technique as the previous recipe and use rfind and substr to find and get what you
want from the full pathname. Example
10-21 shows how.
Example 10-21. Extracting a filename from a path
#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";
}Discussion
See the previous recipe for details on how rfind
and substr work. The only thing noteworthy about Example 10-21 is that, as you probably are
already aware, Windows has a path separator that is a backslash instead of a
forward-slash, so I added an #ifdef to conditionally
set the path separator.
The path class in the Boost Filesystem library
makes getting the last part of a full pathname—which may be a file or directory name—easy
with the path::leaf member function. Example 10-22 shows a simple program that
uses it to print out whether a path refers to a file or directory.
Example 10-22. Getting a filename from a path
#include <iostream> #include <cstdlib> #include <boost/filesystem/operations.hpp> using namespace std; using namespace boost::filesystem; ...