Extracting a Filename from a Full Path

Problem

You have the full path of a filename, e.g., d:appssrcfoo.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 
#include 

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) << ""
";
}

 

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 pathnamewhich may be a file or directory nameeasy 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 
#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.leaf( ) << " is a "
 << (is_directory(p) ? "directory" : "file") << endl;
 }
 catch (exception& e) {
 cerr << e.what( ) << endl;
 }

 return(EXIT_SUCCESS);
}

See the discussion in Recipe 10.7 for more information about the path class.

See Also

Recipe 10.15

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



C++ Cookbook
Secure Programming Cookbook for C and C++: Recipes for Cryptography, Authentication, Input Validation & More
ISBN: 0596003943
EAN: 2147483647
Year: 2006
Pages: 241

Flylib.com © 2008-2020.
If you may any questions please contact us: flylib@qtcs.net