在C语言中,能否获取文件的名称?如果文件是按照以下方式创建的:
FILE *f = fopen ("foo.txt", "r");
“foo.txt”来自于一个超出作用域的变量。是否有一种方法可以从FILE结构中检索它?
实际上,您无法从FILE
对象中检索文件名。
但是,如果传递给fopen
的名称对您很重要,并且由于某种原因该变量超出了范围,您始终可以将FILE*
包装在结构体中,例如:
struct file_with_name {
FILE *f;
char *name; /* OR char name[MAX] */
}
至少这是我会做的,但这取决于你实际想要做什么。
无法从FILE
句柄中获取文件名。如果您以后需要使用它,请自行存储文件名。
由于FILE
对象可能是从没有与其关联的名称创建的(特别是,使用fdopen()
从原始文件描述符创建),因此它们并不总是有可获取的名称。
总的来说,这是不可能的。在Linux上最接近的尝试是:
char buf[PATH_MAX];
snprintf(buf, sizeof buf, "/proc/self/fd/%d", fileno(f));
readlink(buf, buf, sizeof buf);
像这样重复使用buf
是非常丑陋的,但据我所知,它是合法的,并且不违反POSIX的未定义行为。