Sobes.tech
Junior — Middle

Milyen módon biztosítható, hogy egy fájl csak akkor jöjjön létre, ha még nem létezik?

sobes.tech MI

Válasz az MI-től

C/C++-ban több módszer is van arra, hogy csak akkor hozzunk létre fájlt, ha az még nem létezik:

  1. A O_CREAT | O_EXCL zászló használata a open rendszerhívás során (POSIX). Az O_EXCL zászló garantálja, hogy a fájl csak akkor jön létre, ha még nem létezik, különben a hívás hibával ér véget.
#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("A fájl már létezik vagy hiba");
} else {
    // Sikeres fájl létrehozás
    close(fd);
}
  1. A C++ szabványos könyvtárában az <filesystem> segítségével ellenőrizhető a fájl létezése (C++17-től kezdve), és ha nem létezik, akkor létrehozható:
#include <filesystem>
#include <fstream>

namespace fs = std::filesystem;

if (!fs::exists("file.txt")) {
    std::ofstream ofs("file.txt");
    // fájl létrehozva
}
  1. C-ben először a fopen segítségével ellenőrizhető a fájl létezése olvasási módban, és ha nem található, akkor írási módban nyitható meg. Ez a módszer azonban nem atomikus, és versenyhelyzethez vezethet több szálas környezetben.

Ezért a legmegbízhatóbb módszer az, hogy a open-t O_CREAT | O_EXCL zászlókkal használjuk, így csak akkor hozunk létre fájlt, ha az még nem létezik, atomikusan.