Write a C program to check whether a file or directory exists or not. How to check file or directory exists or not in C programming. What is the best way to check file or directory exists or not in C programming.
Required knowledge
Basic Input Output, File handling
How to check if file exists or not?
Unlike other modern programming languages like Java or C#, C does not have any direct built-in library function to check file or directory existence. However, still there are various ways to check if a file exists or not.
C supports three ways to check existence of a file on disk. I will explain them one by one.
Using
fopen()
functionWe have used
fopen()
function several times through the course of file handling exercises.fopen()
returns pointer toFILE
type on success otherwiseNULL
.You can use
fopen()
function to open given file in read mode. If it returnsNULL
then file does not exists otherwise exists on disk.Testing file existence using
fopen()
is not reliable.fopen()
fails if you don’t have read/write/execute permissions on file. In such case alsofopen()
returnsNULL
, but file exists.Using
access()
functionint access(const char *path, int amode);
function is defined inunistd.h
header file. It is used to check accessibility of a file. It is more reliable to check file existence.It accepts two parameters, first
*path
is a pointer to constant character pointing to file path. Next isamode
which is a bit pattern defined by one or combination ofF_OK
,R_OK
,W_OK
andX_OK
constants.It returns 0 if file has requested access
amode
, otherwise -1.Using
stat()
functionProbably this is not the best way to check file existence. But if you have
stat
structure object then you can also use it for checking file existence or check other file permissions.st_mode
field ofstat
structure contains bit pattern specifying permissions on file. IfF_OK
bit is set onst_mode
field then file exists otherwise not.
Program to check whether a file exists or not
/**
* C program to check whether a file exists or not.
*/
#include <stdio.h>
#include <unistd.h>
#include <io.h>
#include <sys/stat.h>
int isFileExists(const char *path);
int isFileExistsAccess(const char *path);
int isFileExistsStats(const char *path);
int main()
{
char path[100];
printf("Enter source file path: ");
scanf("%s", path);
// Check if file exists or not
if (isFileExistsAccess(path))
{
printf("File exists at path '%s'\n", path);
}
else
{
printf("File does not exists at path '%s'\n", path);
}
return 0;
}
/**
* Function to check whether a file exists or not.
* It returns 1 if file exists at given path otherwise
* returns 0.
*/
int isFileExists(const char *path)
{
// Try to open file
FILE *fptr = fopen(path, "r");
// If file does not exists
if (fptr == NULL)
return 0;
// File exists hence close file and return true.
fclose(fptr);
return 1;
}
/**
* Function to check whether a file exists or not using
* access() function. It returns 1 if file exists at
* given path otherwise returns 0.
*/
int isFileExistsAccess(const char *path)
{
// Check for file existence
if (access(path, F_OK) == -1)
return 0;
return 1;
}
/**
* Function to check whether a file exists or not using
* stat() function. It returns 1 if file exists at
* given path otherwise returns 0.
*/
int isFileExistsStats(const char *path)
{
struct stat stats;
stat(path, &stats);
// Check for file existence
if (stats.st_mode & F_OK)
return 1;
return 0;
}
In the above program I have defined functions to check file existence using all three methods described above. However, I haven’t used them all, you can use any of the above defined methods.
Output
Enter source file path: data/file3.txt File exists at path 'data/file3.txt'
How to check if directory exists or not?
To check directory existence we will again use stat
structure. sys/stat.h
header file defines a macro S_ISDIR()
, used to check directory existence. The macro accepts stat.st_mode
param and returns a non-zero integer if given file is a directory, otherwise zero.
Program to check directory existence
/**
* C program to check whether a directory exists or not.
*/
#include <stdio.h>
#include <unistd.h>
#include <sys/stat.h>
int isDirectoryExists(const char *path);
int main()
{
char path[100];
printf("Enter directory path: ");
scanf("%s", path);
// Check if directory exists or not
if (isDirectoryExists(path))
{
printf("Directory exists at path '%s'\n", path);
}
else
{
printf("Directory does not exists at path '%s'\n", path);
}
return 0;
}
/**
* Function to check whether a directory exists or not.
* It returns 1 if given path is directory and exists
* otherwise returns 0.
*/
int isDirectoryExists(const char *path)
{
struct stat stats;
stat(path, &stats);
// Check for file existence
if (S_ISDIR(stats.st_mode))
return 1;
return 0;
}
Output
Enter directory path: data Directory exists at path 'data'
Happy coding 😉