C печатать путь к файлу из FILE * - PullRequest
3 голосов
/ 24 сентября 2019
FILE * fd = fopen ("/tmp/12345","wb");

Если у меня есть переменная fd, как я могу напечатать путь к файлу?(/ tmp / 12345) в среде en Linux.

Ответы [ 3 ]

4 голосов
/ 24 сентября 2019

Не существует стандартного способа получения пути из объекта FILE *, главным образом потому, что у вас могут быть потоки, которые не связаны с именованным файлом (stdin, stdout, stderr, каналы и т. Д.).).Отдельные платформы могут предоставлять утилиты для извлечения пути из потока, но вам придется проверить документацию для этой платформы.

В противном случае вы должны отслеживать эту информацию вручную.

4 голосов
/ 24 сентября 2019

Вы не можете.Не только со стандартным C.

В Linux вы можете сделать:

#include <stdio.h>
#include <unistd.h>
#include <limits.h>
#include <stdlib.h>


int print_filename(FILE *f)
{
    char buf[PATH_MAX];
    char fnmbuf[sizeof "/prof/self/fd/0123456789"];
    sprintf(fnmbuf,"/proc/self/fd/%d", fileno(f));
    ssize_t nr;
    if(0>(nr=readlink(fnmbuf, buf, sizeof(buf)))) return -1;
    else buf[nr]='\0';
    return puts(buf);
}

int main(void)
{
    FILE * f = fopen ("/tmp/12345","wb");
    if (0==f) return EXIT_FAILURE;
    print_filename(f);

}
3 голосов
/ 24 сентября 2019

Поскольку в MacOS нет /proc, fcntl является хорошей альтернативой для извлечения пути дескриптора файла!

Вот рабочий пример:

#include <sys/syslimits.h>
#include <fcntl.h>

char filePath[PATH_MAX];
if (fcntl(fd, F_GETPATH, filePath) != -1)
{
    printf("%s", filePath);
}

Но это работаеттолько для MacOS, для Linux решение PSkocik с использованием readlink кажется лучшим ответом.

...