Учитывая указатель stdio FILE *
, существует ли метод, с помощью которого я могу узнать имя (открытого) файла?
Определение (открытого) имени файла из ФАЙЛА *
Ответы (3)
Это выглядит (здесь) что в системах POSIX вы можете использовать fileno () для получения файлового дескриптора из ФАЙЛА *, а затем использовать fstat для получения статистической информации из файлового дескриптора. Структура stat содержит номер устройства и номер inode. Вы можете проверить файловую систему на наличие файлов, соответствующих индексу. Очевидно, это займет некоторое время, если файловая система заполнена материалом.
Причина, по которой это на самом деле невозможно (как объясняется в связанной статье), заключается в том, что у потока не может быть имени файла, если это что-то вроде stdin или stdout, или если это открытый файл, который был удален. Он может иметь несколько имен из-за жестких ссылок.
В связанной статье упоминается this comp.lang. c FAQ, в котором кратко описывается неразрешимость этой проблемы.
РЕДАКТИРОВАТЬ: Спасибо за исправление.
Нет, нет. Помимо всего прочего, ФАЙЛ * не может относиться к именованному файлу. Если вашему приложению нужна эта возможность, вам нужно будет поддерживать некоторую карту от открытых FILE * s к имени файла, который вы использовали для их открытия.
Стандартного портативного решения не существует. Однако вы можете взглянуть на набор API, предоставленный вашей ОС. В системах POSIX есть функция fstat
, которая принимает дескриптор (не FILE *
) и возвращает некоторую информацию.