ubuntu C++17在给定文件路径的情况下自动创建目录

holgip5t  于 2023-10-17  发布在  其他
关注(0)|答案(2)|浏览(190)
  1. #include <iostream>
  2. #include <fstream>
  3. using namespace std;
  4. int main()
  5. {
  6. ofstream fo("output/folder1/data/today/log.txt");
  7. fo << "Hello world\n";
  8. fo.close();
  9. return 0;
  10. }

我需要将一些日志数据输出到一些带有变量名的文件中。但是,ofstream并不沿着路径创建目录,如果文件的路径不存在,ofstream就不会写入任何地方!
我可以做什么来自动创建文件夹沿着文件路径?系统只有Ubuntu。

zxlwwiss

zxlwwiss1#

您可以使用此函数(CreateDirectoryRecursive)来实现这一点,如下所示。
它使用std::filesystem::create_directoriesstd::filesystem::exists

  1. #include <string>
  2. #include <filesystem>
  3. // Returns:
  4. // true upon success.
  5. // false upon failure, and set the std::error_code & err accordingly.
  6. bool CreateDirectoryRecursive(std::string const & dirName, std::error_code & err)
  7. {
  8. err.clear();
  9. if (!std::filesystem::create_directories(dirName, err))
  10. {
  11. if (std::filesystem::exists(dirName))
  12. {
  13. // The folder already exists:
  14. err.clear();
  15. return true;
  16. }
  17. return false;
  18. }
  19. return true;
  20. }

用法示例:

  1. #include <iostream>
  2. int main()
  3. {
  4. std::error_code err;
  5. if (!CreateDirectoryRecursive("/tmp/a/b/c", err))
  6. {
  7. // Report the error:
  8. std::cout << "CreateDirectoryRecursive FAILED, err: " << err.message() << std::endl;
  9. }
  10. }

注:

<filesystem>从c++-17开始可用。
在此之前,它可以通过<experimental/filesystem>头文件在许多编译器中使用。

展开查看全部
brtdzjyr

brtdzjyr2#

根据cppreference

  1. bool create_directories(const std::filesystem::path& p);

p中不存在的每个元素创建一个目录。如果p已经存在,则该函数不执行任何操作。如果为p解析到的目录创建了目录,则返回true,否则返回false
你可以做的是:
1.获取要将文件保存到的目录路径(在示例中:output/folder1/data/today/)。
1.获取您的文件名(log.txt)。
1.创建(所有)文件夹。
1.使用std::fstream写入文件。

  1. #include <iostream>
  2. #include <vector>
  3. #include <string>
  4. #include <sstream>
  5. #include <fstream>
  6. #include <filesystem>
  7. namespace fs = std::filesystem;
  8. // Split a string separated by sep into a vector
  9. std::vector<std::string> split(const std::string& str, const char sep)
  10. {
  11. std::string token;
  12. std::stringstream ss(str);
  13. std::vector<std::string> tokens;
  14. while (std::getline(ss, token, sep)) {
  15. tokens.push_back(token);
  16. }
  17. return tokens;
  18. }
  19. int main()
  20. {
  21. std::string path = "output/folder1/data/today/log.txt";
  22. std::vector<std::string> dirs = split(path, '/');
  23. if (dirs.empty())
  24. return 1;
  25. std::string tmp = "./"; // Current dir
  26. for (auto it = dirs.begin(); it != std::prev(dirs.end()); ++it)
  27. tmp += *it + '/';
  28. fs::create_directories(tmp);
  29. std::ofstream os(tmp + dirs.back());
  30. os << "Some text...\n";
  31. os.close();
  32. }
展开查看全部

相关问题