What's the best way to check if a file exists in C?

c, cross-platform, filesystems

Solution

Look up the `access()` function, found in `unistd.h`. You can replace your function with

if (access(fname, F_OK) == 0) {
    // file exists
} else {
    // file doesn't exist
}

Under Windows (VC) `unistd.h` does not exist. To make it work it is necessary to define:

#ifdef WIN32
#include <io.h>
#define F_OK 0
#define access _access
#endif

You can also use `R_OK`, `W_OK`, and `X_OK` in place of `F_OK` to check for read permission, write permission, and execute permission (respectively) rather than existence, and you can OR any of them together (i.e. check for both read and write permission using `R_OK|W_OK`)

Update: Note that on Windows, you can't use `W_OK` to reliably test for write permission, since the access function does not take DACLs into account. `access( fname, W_OK )` may return 0 (success) because the file does not have the read-only attribute set, but you still may not have permission to write to the file.

Problem

Is there a better way than simply trying to open the file? ``` int exists(const char *fname) { FILE *file; if ((file = fopen(fname, "r"))) { fclose(file); return 1; } return 0; } ```

Original source

Related problems