C++17 根据文件路径自动创建目录

Huy*_* Le 6 c++ filesystems ubuntu file filepath

#include <iostream>
#include <fstream>
using namespace std;
    
int main()
{
    ofstream fo("output/folder1/data/today/log.txt");
    fo << "Hello world\n";
    fo.close();
    
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我需要将一些日志数据输出到一些具有变量名称的文件中。但是,ofstream不会一路创建目录,如果文件的路径不存在,则不会ofstream写入任何地方!

如何沿着文件路径自动创建文件夹?系统只有Ubuntu。

woh*_*tad 6

您可以使用此函数 ( CreateDirectoryRecursive) 来实现此目的,如下所示。

它使用std::filesystem::create_directoriesstd::filesystem::exists

#include <string>
#include <filesystem>

// Returns:
//   true upon success.
//   false upon failure, and set the std::error_code & err accordingly.
bool CreateDirectoryRecursive(std::string const & dirName, std::error_code & err)
{
    err.clear();
    if (!std::filesystem::create_directories(dirName, err))
    {
        if (std::filesystem::exists(dirName))
        {
            // The folder already exists:
            err.clear();
            return true;    
        }
        return false;
    }
    return true;
}
Run Code Online (Sandbox Code Playgroud)

使用示例:

#include <iostream>

int main() 
{
    std::error_code err;
    if (!CreateDirectoryRecursive("/tmp/a/b/c", err))
    {
        // Report the error:
        std::cout << "CreateDirectoryRecursive FAILED, err: " << err.message() << std::endl;
    }
}
Run Code Online (Sandbox Code Playgroud)

笔记:

<filesystem>自 c++-17 起可用。
在此之前,它可以通过标头在许多编译器中使用<experimental/filesystem>

  • 该代码的哪一部分需要 C++20?为什么要包装 std 函数而不是直接调用它? (2认同)