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; } ```