2011-11-02 86 views
5

是否可以在C中检索文件名?如果文件创建如下:如何从FILE *结构中获取文件名C

 FILE *f = fopen ("foo.txt", "r"); 

而“foo.txt”来自超出范围的变量。有没有办法从FILE结构中检索它?

回答

8

不能实际上是从您的FILE对象中检索文件名。但是,如果传递给fopen的名称对您很重要,并且该变量出于任何原因超出了范围,则可以始终将一个FILE*包装在一个结构中,也就是说,将一个FILE*包装在一个结构中。

struct file_with_name { 
    FILE *f; 
    char *name; /* OR char name[MAX] */ 
} 

至少这就是我要做的,但这取决于你实际上想要做什么。

+1

这就是我最终会做的。谢谢! – rahmu

6

无法从FILE句柄中获取文件名。如果您以后需要使用它,则应该自行存储文件名。可从东西没有与之关联的名称(特别是,从fdopen()原始文件描述符)创建

6

由于FILE对象,他们并不总是有一个名字来获得。

8

不幸的是,在许多系统中,文件名只是指向inode的指针。如果这些文件系统支持硬链接,那意味着每个真实文件有多个文件名。此外,你可以打开一个文件,然后删除文件,在这种情况下甚至不会有文件名,只是一个描述符。由于这些原因,您无法从文件描述符转到文件名。

5

一般来说,这是不可能的。你可以试试最近,在Linux上,方法是:

char buf[PATH_MAX]; 
snprintf(buf, sizeof buf, "/proc/self/fd/%d", fileno(f)); 
readlink(buf, buf, sizeof buf); 

重用buf一样,是可怕的丑,但据我所知,这是每POSIX的法律,而不是不确定的行为。

相关问题