从 FILE * 确定(打开的)文件名

发布于 2024-07-18 06:11:59 字数 63 浏览 7 评论 0原文

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

Given a stdio FILE * pointer, is there a method by which I can discover the name of the (opened) file?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

醉态萌生 2024-07-25 06:11:59

它看起来(来自此处)在 POSIX 系统上,您可以使用 fileno() 从 FILE* 获取文件描述符,然后使用 fstat 从文件描述符获取统计信息。 stat结构包含设备号和inode号。 您可以检查文件系统中是否有与索引节点匹配的文件。 对于一个充满东西的文件系统来说,这显然需要一些时间。

这实际上不可能(如链接文章中所述)的原因是,如果流是 stdin 或 stdout 之类的内容,或者是已删除的打开文件,则流可以没有文件名。 由于硬链接,它也可以有多个名称。

链接的文章提到此 comp.lang。 c FAQ 简要概述了这个问题的不可解决性。

编辑:感谢您的更正。

It looks (from here) that on POSIX systems you can use fileno() to get the file descriptor from a FILE*, then use fstat to get the stat info from the file descriptor. The stat structure contains the device number and inode number. You can check the filesystem for files which match the inode. This will obviously take some time for a filesystem full of stuff.

The reason that this isn't really possible (as explained in the linked article) is that a stream can have no filename if it's something like stdin or stdout, or if it's an open file that has been deleted. It can have multiple names because of hardlinks as well.

The linked article mentions this comp.lang.c FAQ which outlines the insolubility of this problem in brief.

EDIT: Thanks for the correction.

请止步禁区 2024-07-25 06:11:59

不,没有。 除此之外,FILE * 可能不引用命名文件。 如果您的应用程序需要此功能,您将需要维护某种地图
从 open FILE *s 到您用来打开它们的文件名。

No, there isn't. Apart from anything else, the FILE * may not refer to a named file. If your application needs this facility, you wil need to maintain some kind of map
from open FILE *s to the file name you used to open them.

瞳孔里扚悲伤 2024-07-25 06:11:59

没有标准定义的便携式解决方案。 但是,您可以查看操作系统提供的 API 集。 POSIX 系统有一个 fstat 函数,它接受一个描述符(不是 FILE *)并返回一些信息。

There is no standard defined portable solution. However, you can take a look at your OS provided API set. POSIX systems have a fstat function that takes a descriptor (not a FILE *) and returns some information.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文