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

可能重复:
从C中的文件描述符获取文件名

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

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

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

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

 #include  #include  #include  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

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

从C中的文件描述符获取文件名

在Windows下,这也不容易:

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