从C中的文件描述符检索文件名

2024-04-24 07:44:37 发布

您现在位置:Python中文网/ 问答频道 /正文


Tags: python
3条回答

在Windows中,通过GetFileInformationByHandleEx,传递FileNameInfo,可以检索文件名。

您可以在/proc/self/fd/NNN上使用^{},其中NNN是文件描述符。这将为您提供打开时的文件名—但是,如果文件从那时起被移动或删除,则可能不再准确(尽管Linux在某些情况下可以跟踪重命名)。要验证,stat给定的文件名和fstatfd,并确保st_devst_ino是相同的。

当然,并非所有的文件描述符都引用文件,对于那些文件,您将看到一些奇怪的文本字符串,例如pipe:[1538488]。因为所有的真实文件名都是绝对路径,所以您可以很容易地确定哪些是绝对路径。此外,正如其他人所指出的,文件可以有多个指向它们的硬链接-这将只报告它是用哪个打开的。如果要查找给定文件的所有名称,只需遍历整个文件系统。

我在Mac OS X上遇到了这个问题。我们没有/proc虚拟文件系统,因此接受的解决方案无法工作。

相反,我们有一个用于fcntlF_GETPATH命令:

 F_GETPATH          Get the path of the file descriptor Fildes.  The argu-
                    ment must be a buffer of size MAXPATHLEN or greater.

因此,要获取与文件描述符关联的文件,可以使用以下代码段:

#include <sys/syslimits.h>
#include <fcntl.h>

char filePath[PATH_MAX];
if (fcntl(fd, F_GETPATH, filePath) != -1)
{
    // do something with the file path
}

因为我不记得MAXPATHLEN是在哪里定义的,所以我认为来自syslimits的PATH_MAX是可以的。

相关问题 更多 >