Sobes.tech
Junior — Middle

Kuidas tagada faili loomine ainult selle puudumisel?

sobes.tech AI

Vastus AI-lt

C/C++ keeles saab tagada faili loomise ainult siis, kui see veel ei eksisteeri, mitmel viisil:

  1. Kasutades lipikut O_CREAT | O_EXCL faili avamisel süsteemkutses open (POSIX). Lipik O_EXCL tagab, et fail luuakse ainult siis, kui seda veel ei ole, vastasel juhul lõpeb kõne veaga.
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>

int fd = open("file.txt", O_CREAT | O_EXCL | O_WRONLY, 0644);
if (fd == -1) {
    perror("Fail juba eksisteerib või viga");
} else {
    // Fail on edukalt loodud
    close(fd);
}
  1. C++ standardraamatukogus saab kontrollida faili olemasolu <filesystem> abil (alates C++17) ja luua faili, kui seda ei ole:
#include <filesystem>
#include <fstream>

namespace fs = std::filesystem;

if (!fs::exists("file.txt")) {
    std::ofstream ofs("file.txt");
    // fail loodud
}
  1. C keeles saab esmalt kontrollida faili olemasolu fopen abil lugemisrežiimis, ja kui faili ei leidu, avada see kirjutamisrežiimis. Kuid see meetod ei ole atomiline ja võib põhjustada konkurentsitingimusi mitme niidiga keskkonnas.

Seetõttu on kõige usaldusväärsem viis kasutada open koos lipikutega O_CREAT | O_EXCL, et atomiliselt luua fail ainult siis, kui see veel ei eksisteeri.