Определение (открытого) имени файла из ФАЙЛА *

Учитывая указатель stdio FILE *, существует ли метод, с помощью которого я могу узнать имя (открытого) файла?


person Jamie    schedule 06.05.2009    source источник
comment
Дескриптор файла - это целое число, которое отличается от FILE *. Я предполагаю, что вы хотите получить ответ в терминах FILE *, но вы можете изменить свой заголовок.   -  person Matt K    schedule 06.05.2009


Ответы (3)


Это выглядит (здесь) что в системах POSIX вы можете использовать fileno () для получения файлового дескриптора из ФАЙЛА *, а затем использовать fstat для получения статистической информации из файлового дескриптора. Структура stat содержит номер устройства и номер inode. Вы можете проверить файловую систему на наличие файлов, соответствующих индексу. Очевидно, это займет некоторое время, если файловая система заполнена материалом.

Причина, по которой это на самом деле невозможно (как объясняется в связанной статье), заключается в том, что у потока не может быть имени файла, если это что-то вроде stdin или stdout, или если это открытый файл, который был удален. Он может иметь несколько имен из-за жестких ссылок.

В связанной статье упоминается this comp.lang. c FAQ, в котором кратко описывается неразрешимость этой проблемы.

РЕДАКТИРОВАТЬ: Спасибо за исправление.

person Matt K    schedule 06.05.2009
comment
Спасибо больше, чем просто за то, что ты не можешь ответить. - person Jamie; 06.05.2009
comment
fstat () используется для описания файла, открытого дескриптором файла. Вы используете fileno (), чтобы получить дескриптор файла из указателя файла. Обратите внимание, что индексный дескриптор может не быть найден, или для файла может быть несколько возможных имен (в зависимости от количества жестких ссылок). - person Jonathan Leffler; 07.05.2009

Нет, нет. Помимо всего прочего, ФАЙЛ * не может относиться к именованному файлу. Если вашему приложению нужна эта возможность, вам нужно будет поддерживать некоторую карту от открытых FILE * s к имени файла, который вы использовали для их открытия.

person Community    schedule 06.05.2009

Стандартного портативного решения не существует. Однако вы можете взглянуть на набор API, предоставленный вашей ОС. В системах POSIX есть функция fstat, которая принимает дескриптор (не FILE *) и возвращает некоторую информацию.

person dirkgently    schedule 06.05.2009