【发布时间】:2011-11-02 23:51:48
【问题描述】:
是否可以在 C 中检索文件名?如果创建文件如下:
FILE *f = fopen ("foo.txt", "r");
而“foo.txt”来自一个超出范围的变量。有没有办法从 FILE 结构中检索它?
【问题讨论】:
是否可以在 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] */
}
至少我会这样做,但这取决于你实际想要做什么。
【讨论】:
不幸的是,在许多系统上,文件名只是指向 inode 的指针。如果这些文件系统支持硬链接,这意味着每个真实文件有多个文件名。此外,您可以打开一个文件,然后删除该文件,在这种情况下甚至没有文件名,只有一个描述符。由于这些原因,您不能从文件描述符转到文件名。
【讨论】:
不可能从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 未定义的行为。
【讨论】: