Ежедневная часть C++ № 242. Манипулирование файлами с использованием библиотеки std::filesystem.
Помимо исследования файловой системы, std::filesystem предлагает типичные операции по манипулированию файлами.
Каждая операция предлагает два варианта: один выбрасывает другой, который возвращает потенциальную ошибку в качестве выходного параметра.
В следующем примере используются различные версии операций, чтобы минимизировать обработку ошибок.
#include <filesystem> #include <fstream> #include <stdexcept> std::filesystem::path file = "current_file"; { std::ofstream f(weakly_canonical(file)); f << "Current content\n"; } // Create a backup folder if it doesn't exist std::filesystem::path backup_folder = "./backup"; if (!exists(backup_folder)) create_directory(backup_folder); // Check if there is sufficient space if (space(backup_folder).available < file_size(file)) throw std::runtime_error("Not enough space for backup."); // Construct a filename with a timestamp std::filesystem::path backup_file = backup_folder / file.filename(); { using namespace std::chrono; auto cnt = duration_cast<seconds>(system_clock::now().time_since_epoch()) .count(); backup_file += std::to_string(cnt); } // Create a backup copy(file, backup_file); // Create or update the symlink to the latest backup std::filesystem::path symlink = file.parent_path() / "current_backup"; if (exists(symlink)) remove(symlink); create_symlink(backup_file, symlink); /* Example result: "./current_backup" ("./backup/current_file1662980474") "./current_file" "./backup" "./backup/current_file1662980474" */
Откройте пример в Compiler Explorer.