2011-02-01 63 views
12

可能重复:
Getting Filename from file descriptor in C有没有办法从`FILE *`获取文件名?

有一个简单的和(合理的),便携式获得从FILE*文件名的方法是什么?

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

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

+0

重复http://stackoverflow.com/questions/1188757/getting-filename-from-file-descriptor-in-c – 2011-02-01 12:12:39

+1

没有标准的方式,我知道的; `freopen`可以让你改变读/写和二进制/正常模式,但是如果你想为自己的名字命名(比如打印一条错误信息),那么你运气不好。 – dmckee 2011-02-01 12:13:12

回答

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

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的文件句柄)

相关问题