Определение (открытого) имени файла из ФАЙЛА * - PullRequest
3 голосов
/ 06 мая 2009

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

Ответы [ 3 ]

8 голосов
/ 06 мая 2009

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

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

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

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

2 голосов
/ 06 мая 2009

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

1 голос
/ 06 мая 2009

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

...