Junior — Middle
Чӣ гуна роҳҳо метавонанд таъмини созишномаи файл танҳо дар ҳолати набудани он бошанд?
sobes.tech AI
Ҷавоб аз AI
Дар C/C++ метавон танҳо дар сурате, ки файл вуҷуд надошта бошад, онро бо чанд роҳ таъмин кард:
- Истифодаи парчами
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);
}
- Дар китобхонаи стандартии C++ метавонед мавҷудияти файлро бо истифода аз
<filesystem>(аз C++17) санҷед ва агар он вуҷуд надошта бошад, файлро созед:
#include <filesystem>
#include <fstream>
namespace fs = std::filesystem;
if (!fs::exists("file.txt")) {
std::ofstream ofs("file.txt");
// файл сохта шуд
}
- Дар C, аввал метавонед мавҷудияти файлро бо
fopenдар режими хондан санҷед, ва агар файл ёфт нашуд, онро барои навишт кушоед. Аммо ин усул атомӣ нест ва метавонад ба шароити рақобат дар муҳити бисёрсоҳавӣ оварда расонад.
Беҳтарин роҳи эътимоднок истифодаи open бо парчамҳо O_CREAT | O_EXCL аст, ки файлро танҳо дар сурате, ки вуҷуд надошта бошад, атомӣ созад.