如何从C语言中的FILE*结构体中获取文件名

6

在C语言中,能否获取文件的名称?如果文件是按照以下方式创建的:

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

“foo.txt”来自于一个超出作用域的变量。是否有一种方法可以从FILE结构中检索它?

5个回答

8

实际上,您无法从FILE对象中检索文件名。

但是,如果传递给fopen的名称对您很重要,并且由于某种原因该变量超出了范围,您始终可以将FILE*包装在结构体中,例如:

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

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


1
那就是我最终要做的。谢谢! - rahmu

8
很遗憾,在许多系统上,文件名只是指向inode的指针。如果这些文件系统支持硬链接,那意味着一个真实的文件有多个文件名。此外,您可以打开一个文件,然后删除该文件,这种情况下甚至没有文件名,只有一个描述符。因此,您无法从文件描述符到文件名。

6

无法从FILE句柄中获取文件名。如果您以后需要使用它,请自行存储文件名。


6

由于FILE对象可能是从没有与其关联的名称创建的(特别是,使用fdopen()从原始文件描述符创建),因此它们并不总是有可获取的名称。


5

总的来说,这是不可能的。在Linux上最接近的尝试是:

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

像这样重复使用buf是非常丑陋的,但据我所知,它是合法的,并且不违反POSIX的未定义行为。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接