从FILE *确定已打开的文件名

3

给定一个stdio FILE *指针,是否有一种方法可以发现打开的文件的名称?


文件描述符是一个整数,它与FILE不同。我假设您希望以FILE的术语回答,但您可能需要编辑标题。 - Matt K
3个回答

8
这里所述,POSIX系统上可以使用fileno()从FILE*获取文件描述符,然后使用fstat从文件描述符获取stat信息。 stat结构包含设备号和inode号。您可以检查与inode匹配的文件系统中的文件。对于一个充满各种东西的文件系统,这显然需要一些时间。
这不太可能实现(如链接的文章所述)的原因是,如果流是stdin或stdout之类的内容,或者如果它是已删除的打开文件,则可能没有文件名。它也可能因为硬链接而有多个名称。
链接的文章提到了这篇comp.lang.c FAQ,其中简要概述了这个问题的无解性。
编辑:感谢更正。

感谢您不仅仅给出了“不行”的答案。 - Jamie
1
fstat()函数用于描述文件描述符所打开的文件。您可以使用fileno()函数从文件指针获取文件描述符。需要注意的是,可能找不到inode,或者文件可能有多个可能的名称(取决于硬链接数)。 - Jonathan Leffler

2

没有,除此之外,FILE * 可能并不是指向具名文件的。如果你的应用程序需要这个功能,你需要维护一种从打开的 FILE * 到所使用的文件名的映射。


1

目前还没有定义标准的可移植解决方案。不过,你可以查看操作系统提供的 API 集合。POSIX 系统有一个 fstat 函数,它接受一个描述符(而不是 FILE *)并返回一些信息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接