Sobes.tech
Junior — Middle

De que formas é que se pode garantir a criação de um ficheiro apenas na ausência dele?

sobes.tech IA

Resposta da IA

Em C/C++, pode garantir a criação de um ficheiro apenas se ele não existir de várias formas:

  1. Utilizando a flag O_CREAT | O_EXCL ao abrir o ficheiro através da chamada de sistema open (POSIX). A flag O_EXCL garante que o ficheiro será criado apenas se ainda não existir, caso contrário, a chamada terminará com um erro.
#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("O ficheiro já existe ou erro");
} else {
    // Ficheiro criado com sucesso
    close(fd);
}
  1. Na biblioteca padrão de C++, pode verificar a existência do ficheiro usando <filesystem> (a partir do C++17) e criar o ficheiro se não existir:
#include <filesystem>
#include <fstream>

namespace fs = std::filesystem;

if (!fs::exists("file.txt")) {
    std::ofstream ofs("file.txt");
    // ficheiro criado
}
  1. Em C, pode primeiro verificar a existência do ficheiro usando fopen em modo leitura, e se o ficheiro não for encontrado, abri-lo em modo escrita. Mas esta abordagem não é atómica e pode levar a condições de corrida em ambientes multithread.

Assim, a forma mais fiável é usar open com as flags O_CREAT | O_EXCL para criar o ficheiro de forma atómica apenas se ele não existir.