Ежедневная часть 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.