Sobes.tech
Junior — Middle

По какви начини може да се осигури създаването на файл само в случай, че той липсва?

sobes.tech AI

Отговор от 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("Файлът вече съществува или грешка");
} 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, за да се създаде файл атомарно само ако не съществува.