Verificar se existe um ficheiro em C
-
fopen()
Função para verificar se um ficheiro existe em C -
stat()
Função para verificar se um ficheiro existe em C -
access()
Function to Check if a File Exists in 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