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 аст, ки файлро танҳо дар сурате, ки вуҷуд надошта бошад, атомӣ созад.