Как получить имя файла из структуры FILE * в C - PullRequest
5 голосов
/ 03 ноября 2011

Можно ли получить имя файла в C? Если файл создан следующим образом:

     FILE *f = fopen ("foo.txt", "r");

И "foo.txt" происходит из переменной вне области видимости. Есть ли способ извлечь его из структуры FILE?

Ответы [ 5 ]

8 голосов
/ 03 ноября 2011

Вы не можете на самом деле получить имена файлов из ваших FILE объектов.

Однако, если имя, передаваемое в fopen, важно для вас, и эта переменная по какой-либо причине находится вне области видимости, вы всегда можете заключить FILE* в структуру, т. Е.

struct file_with_name {
   FILE *f;
   char *name; /* OR char name[MAX] */
}

По крайней мере, это то, что я бы сделал, но это зависит от того, что вы на самом деле пытаетесь сделать.

8 голосов
/ 03 ноября 2011

К сожалению, во многих системах имя файла - это просто указатель на индекс. И если эти файловые системы поддерживают жесткие ссылки, это означает, что в реальном файле существует несколько имен файлов. Кроме того, вы можете открыть файл и затем удалить файл, в этом случае даже не будет имени файла, только дескриптор. По этим причинам вы не можете перейти от дескриптора файла к имени файла.

6 голосов
/ 03 ноября 2011

Поскольку FILE объекты могут быть созданы из вещей, с которыми не связано имя (в частности, из необработанного файлового дескриптора с fdopen()), у них не всегда есть имя, которое нужно получить.

6 голосов
/ 03 ноября 2011

Невозможно получить имя файла из дескриптора FILE.Вы должны сохранить имя файла самостоятельно, если вам позже понадобится его использовать.

5 голосов
/ 03 ноября 2011

В общем, это невозможно. Самое близкое, что вы можете попробовать в Linux, это:

char buf[PATH_MAX];
snprintf(buf, sizeof buf, "/proc/self/fd/%d", fileno(f));
readlink(buf, buf, sizeof buf);

Повторное использование buf, как это ужасно уродливо, но, насколько я могу судить, это законное и не неопределенное поведение для POSIX.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...