有没有办法从`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文件句柄)