有没有办法从`FILE *`获取文件名?

时间:2011-02-01 12:06:27

标签: c

  

可能重复:
  Getting Filename from file descriptor in C

是否有一种简单且(合理)可移植的方式从FILE*获取文件名?

我使用f = fopen(filename, ...)打开文件,然后将f传递给其他各种函数,其中一些函数可能会报告错误。我想在错误消息中报告文件名,但避免传递额外的参数。

我可以创建一个自定义包装器struct { FILE *f, const char *name },但是可能有更简单的方法吗? (如果FILE*未使用fopen打开,我不关心结果。)

2 个答案:

答案 0 :(得分:12)

在某些平台(例如Linux)上,您可以通过阅读/proc/self/fd/<number>的链接来获取它,如下所示:

#include <stdio.h>
#include <unistd.h>
#include <string.h>

int main(void)
{
    char path[1024];
    char result[1024];

    /* Open a file, get the file descriptor. */
    FILE *f = fopen("/etc/passwd", "r");
    int fd = fileno(f); 

    /* Read out the link to our file descriptor. */
    sprintf(path, "/proc/self/fd/%d", fd);
    memset(result, 0, sizeof(result));
    readlink(path, result, sizeof(result)-1);

    /* Print the result. */
    printf("%s\n", result);
}

这将在我的系统上根据需要打印出/etc/passwd

答案 1 :(得分:2)

这有点困难,因为FILE *可以从文件句柄读取/写入,该文件句柄根本不与命名文件相关联(例如,未命名的管道或套接字)。 您可以使用fileno()获取文件句柄,然后有系统特定的方法来了解文件名。以下是关于如何在Linux下执行此操作的讨论:

Getting Filename from file descriptor in C

在Windows下,这也不容易:

http://msdn.microsoft.com/en-us/library/aa366789(VS.85).aspx(作为额外步骤,您使用_get_osfhandle()从c库文件描述符中获取Windows文件句柄)