Verificar se existe um ficheiro em C

Satishkumar Bharadwaj 12 outubro 2023
  1. fopen() Função para verificar se um ficheiro existe em C
  2. stat() Função para verificar se um ficheiro existe em C
  3. access() Function to Check if a File Exists in C
Verificar se existe um ficheiro em C

Este tutorial introduz como verificar se o ficheiro existe em C. A forma de verificar se um ficheiro existe é tentar abrir o ficheiro no modo de leitura ou escrita. Este programa está a abrir um ficheiro em modo de leitura.

fopen() Função para verificar se um ficheiro existe em C

#include <stdio.h>
int main(void) {
  FILE *file;

  if (file = fopen("demo.txt", "r")) {
    fclose(file);
    printf("file exists");
  } else {
    printf("file doesn't exist");
  }

  return 0;
}

Resultado:

file exists

Aqui o nome do ficheiro é demo.txt. O programa C e o ficheiro demo.txt encontram-se no mesmo directório. Portanto, a saída é file exists.

Se a localização do programa C e do ficheiro forem diferentes, temos de especificar o caminho completo do ficheiro.

Podemos criar uma função definida pelo utilizador e verificar se o ficheiro existe ou não. Abaixo está o programa com uma função definida pelo utilizador.

#include <stdio.h>
int checkIfFileExists(const char *filename);
int main(void) {
  if (checkIfFileExists("demo.txt")) {
    printf("file exists");
  } else {
    printf("file does not exists");
  }
}

int checkIfFileExists(const char *filename) {
  FILE *file;
  if (file = fopen(filename, "r")) {
    fclose(file);
    return 1;
  }

  return 0;
}

O programa imprimirá file exists se o ficheiro demo.txt e o programa C tiverem a mesma localização. Se o programa C e o nome do ficheiro estiverem em locais diferentes, temos de especificar o caminho completo do ficheiro.

stat() Função para verificar se um ficheiro existe em C

Lemos os atributos do ficheiro utilizando a função stat() em vez de ler dados de um ficheiro. Esta função retornará 0 se a operação for bem sucedida; caso contrário, retornará -1, se o ficheiro não existir.

#include <stdio.h>
#include <sys/stat.h>

int checkIfFileExists(const char* filename);

int main(void) {
  if (checkIfFileExists("demo.txt")) {
    printf("file exists");
  } else {
    printf("file does not exists");
  }
}

int checkIfFileExists(const char* filename) {
  struct stat buffer;
  int exist = stat(filename, &buffer);
  if (exist == 0)
    return 1;
  else
    return 0;
}

O programa imprimirá file exists se o ficheiro demo.txt e o programa C tiverem a mesma localização. Se o programa C e o nome do ficheiro estiverem em locais diferentes, temos de especificar o caminho completo do ficheiro.

access() Function to Check if a File Exists in C

Outra forma de verificar se o ficheiro existe é utilizar a função access(). O ficheiro de cabeçalho unistd.h tem uma função access para verificar se o ficheiro existe ou não.

Podemos utilizar R_OK para permissão de leitura, W_OK para permissão de escrita, e X_OK para executar a permissão. Podemos utilizá-los em conjunto como R_OK|W_OK para ler e escrever a permissão.

#include <stdio.h>
#include <unistd.h>
int main(void) {
  if (access("C:\\TEMP\\demo.txt", F_OK) != -1) {
    printf("file is found");
  } else {
    printf("file is not found");
  }
  return 0;
}

Resultado:

file is found

Aqui, C:\TEMPdemo.txt é a localização do ficheiro. Se o ficheiro existir, imprime file is found; caso contrário, imprime file is not found. A localização do programa e o ficheiro demo.txt têm a mesma localização. Caso contrário, temos de especificar a localização do ficheiro. O combinatino das funções stat() e access() é uma boa escolha para o sistema operativo Linux.

Outra forma de utilizar a função access() é a seguinte:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

void checkIfFileExists(const char *fileName);

int main(void) {
  char *fileName = "C:\\TEMP\\demo.txt";

  checkIfFileExists(fileName);
  return 0;
}

void checkIfFileExists(const char *fileName) {
  if (!access(fileName, F_OK)) {
    printf("The File %s was Found\n", fileName);
  } else {
    printf("The File %s not Found\n", fileName);
  }

  if (!access(fileName, R_OK)) {
    printf("The File %s can be read\n", fileName);
  } else {
    printf("The File %s cannot be read\n", fileName);
  }

  if (!access(fileName, W_OK)) {
    printf("The File %s  can be Edited\n", fileName);
  } else {
    printf("The File %s  cannot be Edited\n", fileName);
  }

  if (!access(fileName, X_OK)) {
    printf("The File %s is an Executable\n", fileName);
  } else {
    printf("The File %s is not an Executable\n", fileName);
  }
}

Resultado:

The file C:\TEMP\demo.txt was found
The file C:\TEMP\demo.txt can be read
The file C:\TEMP\demo.txt can be Edited
The file C:\TEMP\demo.txt is an executable

Artigo relacionado - C File