Sobes.tech
Назад к вопросам
Junior — Middle
86

Какими способами можно обеспечить создание файла только в случае его отсутствия?

Компании, где спрашивали
КасперскийКасперский

Ответ от нейросети

sobes.tech AI

В C/C++ можно обеспечить создание файла только в случае его отсутствия несколькими способами:

  1. Использование флага O_CREAT | O_EXCL при открытии файла через системный вызов open (POSIX). Флаг O_EXCL гарантирует, что файл будет создан только если его ещё нет, иначе вызов завершится с ошибкой.
#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("File already exists or error");
} else {
    // Файл успешно создан
    close(fd);
}
  1. В стандартной библиотеке C++ можно проверить существование файла с помощью <filesystem> (начиная с C++17) и создать файл, если его нет:
#include <filesystem>
#include <fstream>

namespace fs = std::filesystem;

if (!fs::exists("file.txt")) {
    std::ofstream ofs("file.txt");
    // файл создан
}
  1. В C можно сначала проверить существование файла через fopen с режимом чтения, а если файл не найден, открыть его для записи. Но такой подход не атомарен и может привести к состоянию гонки в многопоточной среде.

Таким образом, наиболее надежный способ — использовать open с флагами O_CREAT | O_EXCL для атомарного создания файла только если он отсутствует.