get directory from file path c++

The quick and dirty:

Note that you must also look for / because it is allowed alternative path separator on Windows

#include <string>
#include <iostream>

std::string dirnameOf(const std::string& fname)
{
     size_t pos = fname.find_last_of("\\/");
     return (std::string::npos == pos)
         ? ""
         : fname.substr(0, pos);
}

int main(int argc, const char *argv[])
{
     const std::string fname = "C:\\MyDirectory\\MyFile.bat";

     std::cout << dirnameOf(fname) << std::endl;
}

Use the Boost.filesystem parent_path() function.

Ex. argument c:/foo/bar => c:/foo

More examples here : path decomposition table and tutorial here.


The initialisation is incorrect as you need to escape the backslashes:

string filename = "C:\\MyDirectory\\MyFile.bat";

To extract the directory if present:

string directory;
const size_t last_slash_idx = filename.rfind('\\');
if (std::string::npos != last_slash_idx)
{
    directory = filename.substr(0, last_slash_idx);
}

Tags:

C++

Visual C++