Ты ожидал, что тебе укажут на какую-то специальную функцию вроде bool fexist(*char) в стандартной библиотеке? Какой вообще ответ ты ожидал получить? Задумывался ли ты над вопросом, а как проще и быстрее всего проверить существует ли файл (не важно на каком ЯП)?
Сколько пишу на С, всё время именно так существование файла проверяю. Хотя чаще возникает задача: если файл существует, открыть, если не существует - создать. Опять же решается open.
Ты всё же почитай man 2 open и man 2 stat и выбери подходящий способ.
Я не вижу костыль, я просто сомневаюсь, что лучше всего вызвать ошибку, чтобы проверить есть ли файл. Будет неприятно, если программа рухнет. Опять же, я не настаиваю на правильности этих сомнений.
> сомневаюсь, что лучше всего вызвать ошибку, чтобы проверить есть ли файл. Будет неприятно, если программа рухнет.
/me безнадежно прикладывает ладонь к лицу.
Раз ты боишься, что твоя программа может рухнуть от непонятных причин, значит ты просто не знаешь, почему твоя программа вообще работает. Советую что-то поменять в консерватории.
Это было первое. И второе: что ты будешь делать, если файл будет удалён после проверки его существования? Вылетишь в сегфолт? Подумай об этом. Проверка существования должна осуществляться при открытии. В этом случае ты атомарно получаешь либо дескриптор открытого файла, либо код ошибки. Без неожиданностей.
Программа не рухнет, т.к. open вернёт -1, а из errno ты узнаешь, что произошла ошибка EACCESS. Точнее скажет stat - тоже возвращает -1, но код в errno будет ENOENT (т.е. файл не существует). Ты сам обрабатываешь эту ошибку и принимаешь дальнейшее решение: либо создать такой файл, либо завершить программу корректно, либо что-то ещё. Никаких проблем с «падением» программы.
access() checks whether the calling process can access the file path‐
name. If pathname is a symbolic link, it is dereferenced.
The mode specifies the accessibility check(s) to be performed, and is
either the value F_OK, or a mask consisting of the bitwise OR of one or
more of R_OK, W_OK, and X_OK. F_OK tests for the existence of the
file. R_OK, W_OK, and X_OK test whether the file exists and grants
read, write, and execute permissions, respectively.
В любом предложенном тебе здесь случае - будь то open, stat, fopen или access - суть методики остаётся одной и той же: отслеживаешь возвращаемый код, и если он = -1, то файл очевидно не существует (уточнить ошибку можно по errno). После этого делаешь то, что тебе нужно.
Пока ты работаешь с функциями из стандартной библиотеки и системными вызовами, программа у тебя может рухнуть только по одной причине: ты сам накосячишь с памятью или еще чем-нибудь. Любая (не написанная тобой) функция либо отработает корректно и вернет ожидаемый результат, либо вернет признак ошибки (опять же, корректно вернув управление вызвавшему коду) и обработать код ошибки твоя святая обязанность, как программиста... Если ты не обрабатываешь коды завершения функций, то ты ССЗБ. Уж извини.
Просто гораздо чаще встречается ситуация (я уже писал выше), когда при открытии файла (open) одновременно проверяется его существование, и если файл не существует, то он создаётся. У меня соотношение таких ситуаций к ситуации с простой проверкой существования примерно 10 к 1. Поэтому и про access вспоминаем гораздо реже. :)
А чего следить-то: у каждого своя точка зрения, в чём-то верная, в чём-то не совсем. После чтения man-ов выбери наиболее подходящий именно тебе в данной конкретной задаче способ и используй его. Я чаще под Unix/Linux на С писал, поэтому по большей части open/stat использовал. Про fopen и access не сразу вспомнил, каюсь. Но это тоже вполне нормальные способы. Выбирай тот, который лучше всего укладывается в задачу, и вперёд. :)
И ещё одно замечание - поскольку ты задачу свою крайне лаконично изложил. :)
Если тебе нужно не просто однократно проверить существование файла, а отследить его создание или удаление, то имеет смысл посмотреть в сторону inotify.
А вот будет ли работать этот код в ситуации, когда владелец файла является членом группы-владельца, и при этом для группы право доступа есть, а для владельца - нету (труднопредставимо , но все же)? Ведь при обращении к файлу сначала вроде как проверяются права для владельца, и если там запрет - владелец к файлу доступа на получит, а вот эта функция вернет TRUE.
Откуда трава? У меня на всю музыку на компе права на полный доступ пользователю mpd и группе denis (одноименная с пользователем), однако проблем не испытываю, ни с прослушиванием музыки, ни с редактированием тегов и всей библиотеки в целом?
В Unix проверка прав по умолчанию запретительная, если на любом уровне не встретится разрешительное правило. Отсутствие +r или +w для владельца еще на значит, что он не имеет доступа к файлу. Это значит только, что нужно еще проверить права для группы и для всех.