是否可以在C中检索文件的名称?如果创建的文件如下所示:
FILE *f = fopen ("foo.txt", "r");
Run Code Online (Sandbox Code Playgroud)
而"foo.txt"来自一个超出范围的变量.有没有办法从FILE结构中检索它?
不幸的是,在许多系统上,文件名只是指向inode的指针.如果这些文件系统支持硬链接,那意味着每个真实文件有多个文件名.此外,您可以打开一个文件,然后删除该文件,在这种情况下甚至没有文件名,只有一个描述符.由于这些原因,您无法从文件描述符转到文件名.
实际上,您无法从FILE对象中检索文件名.
但是,如果传递给的名称fopen对您很重要,并且该变量因任何原因超出范围,您可以始终将FILE*结构包装在一个结构中,即.
struct file_with_name {
FILE *f;
char *name; /* OR char name[MAX] */
}
Run Code Online (Sandbox Code Playgroud)
至少那是我要做的,但这取决于你实际上要做什么.
一般来说,这是不可能的.在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的未定义行为.