19

Is there a way using the standard c or c++ library to make a directory, including the subfolders that may be required given a string of the absolute path?

Thanks

Sergei Krivonos
  • 4,217
  • 3
  • 39
  • 54
jmasterx
  • 52,639
  • 96
  • 311
  • 557

3 Answers3

19

Yes, In C++17, You can use filesystem

#if __cplusplus < 201703L // If the version of C++ is less than 17
#include <experimental/filesystem>
    // It was still in the experimental:: namespace
    namespace fs = std::experimental::filesystem;
#else
#include <filesystem>
    namespace fs = std::filesystem;
#endif

int main()
{
    // create multiple directories/sub-directories.
    fs::create_directories("SO/1/2/a"); 
    // create only one directory.
    fs::create_directory("SO/1/2/b");
    // remove the directory "SO/1/2/a".
    fs::remove("SO/1/2/a");
    // remove "SO/2" with all its sub-directories.
    fs::remove_all("SO/2");
}

Note to use only forward slashes / and you may need to include <experimental/filesystem>.

Sergei Krivonos
  • 4,217
  • 3
  • 39
  • 54
Beyondo
  • 2,952
  • 1
  • 17
  • 42
12

Using the standard library, you'd do it like so in C++:

// ASSUMED INCLUDES
// #include <string> // required for std::string
// #include <sys/types.h> // required for stat.h
// #include <sys/stat.h> // no clue why required -- man pages say so

std::string sPath = "/tmp/test";
mode_t nMode = 0733; // UNIX style permissions
int nError = 0;
#if defined(_WIN32)
  nError = _mkdir(sPath.c_str()); // can be used on Windows
#else 
  nError = mkdir(sPath.c_str(),nMode); // can be used on non-Windows
#endif
if (nError != 0) {
  // handle your error here
}
Volomike
  • 23,743
  • 21
  • 113
  • 209
10

No, however if you're willing to use boost:

boost::filesystem::path dir("absolute_path");
boost::filesystem::create_directory(dir);

There is a proposal to add a filesystem library to the standard library that will be based on boost::filesystem. Using boost::filesystem and appropriate typedefs will put you in a good position to migrate to the future standard when it becomes available for your compiler of choice.