Sobes.tech
Junior — Middle

W jaki sposób można zapewnić tworzenie pliku tylko w przypadku jego braku?

sobes.tech AI

Odpowiedź od AI

W C/C++ można zapewnić utworzenie pliku tylko wtedy, gdy nie istnieje, na kilka sposobów:

  1. Użycie flagi O_CREAT | O_EXCL podczas otwierania pliku za pomocą wywołania systemowego open (POSIX). Flaga O_EXCL gwarantuje, że plik zostanie utworzony tylko jeśli jeszcze nie istnieje, w przeciwnym razie wywołanie zakończy się błędem.
#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("Plik już istnieje lub błąd");
} else {
    // Plik został pomyślnie utworzony
    close(fd);
}
  1. W standardowej bibliotece C++ można sprawdzić istnienie pliku za pomocą <filesystem> (od C++17) i utworzyć plik, jeśli go nie ma:
#include <filesystem>
#include <fstream>

namespace fs = std::filesystem;

if (!fs::exists("file.txt")) {
    std::ofstream ofs("file.txt");
    // plik utworzony
}
  1. W C można najpierw sprawdzić istnienie pliku za pomocą fopen w trybie odczytu, a jeśli plik nie zostanie znaleziony, otworzyć go w trybie zapisu. Jednak takie podejście nie jest atomowe i może prowadzić do warunków wyścigu w środowiskach wielowątkowych.

Dlatego najbezpieczniejszym sposobem jest użycie open z flagami O_CREAT | O_EXCL, aby atomowo utworzyć plik tylko wtedy, gdy nie istnieje.