Используйте access(2)
в POSIX. В стандарте C лучшее, что вы можете сделать, это попытаться открыть его с помощью fopen()
и посмотреть, удастся ли это.
Если fopen()
возвращает NULL
, вы можете попытаться использовать errno
, чтобы различать случаи "Файл не существует" (errno == ENOENT
) и "Отказано в доступе" (errno == EACCES
) - но, к сожалению, это случаи два значения errno
определяются только POSIX.
(Даже в POSIX в большинстве случаев лучше всего попытаться открыть файл, а затем посмотреть, почему он не удался, поскольку использование access()
вводит очевидное условие гонки).