如何从C中的FILE*struct获取文件名

rah*_*hmu 5 c file

是否可以在C中检索文件的名称?如果创建的文件如下所示:

     FILE *f = fopen ("foo.txt", "r");
Run Code Online (Sandbox Code Playgroud)

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

Chr*_*rle 8

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


Aus*_*oke 8

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

但是,如果传递给的名称fopen对您很重要,并且该变量因任何原因超出范围,您可以始终将FILE*结构包装在一个结构中,即.

struct file_with_name {
   FILE *f;
   char *name; /* OR char name[MAX] */
}
Run Code Online (Sandbox Code Playgroud)

至少那是我要做的,但这取决于你实际上要做什么.


K-b*_*llo 6

它不可能从FILE句柄中获取文件名.如果以后需要使用它,您应该自己存储文件名.


Gre*_*ill 6

由于FILE可以从没有与之关联的名称的事物(特别是从原始文件描述符中fdopen())创建对象,因此它们并不总是具有要获取的名称.


R..*_*R.. 5

一般来说,这是不可能的.在Linux上,您可以尝试的最接近的是:

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

buf像这样重用是非常丑陋的,但据我所知,这是合法的,而不是每个POSIX的未定义行为.