【问题标题】:How to get a file's name from FILE* struct in C如何从 C 中的 FILE* 结构中获取文件名
【发布时间】:2011-11-02 23:51:48
【问题描述】:

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

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

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

【问题讨论】:

    标签: c file


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 这就是我最终要做的。谢谢!
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        由于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 未定义的行为。

          【讨论】:

            猜你喜欢
            • 2011-04-28
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-08-08
            • 1970-01-01
            • 1970-01-01
            • 2011-02-05
            • 2018-05-11
            相关资源
            最近更新 更多