bdo*_*lan 111
您可以使用readlink在/proc/self/fd/NNN其中NNN是文件描述符.这将为您提供文件的名称,就像它打开时一样 - 但是,如果从那时起移动或删除文件,它可能不再准确(尽管Linux可以在某些情况下跟踪重命名).要验证,stat给出的文件名和fstat你拥有的fd,并确保st_dev和st_ino相同.
当然,并非所有文件描述符都引用文件,对于那些文档描述符,您会看到一些奇怪的文本字符串,例如pipe:[1538488].由于所有真实文件名都是绝对路径,因此您可以轻松确定哪些文件名.此外,正如其他人所指出的那样,文件可以有多个指向它们的硬链接 - 这只会报告它打开的链接.如果要查找给定文件的所有名称,则只需遍历整个文件系统.
zne*_*eak 82
我在Mac OS X上遇到了这个问题.我们没有/proc虚拟文件系统,因此接受的解决方案无效.
相反,我们有一个F_GETPATH命令fcntl:
F_GETPATH Get the path of the file descriptor Fildes. The argu-
ment must be a buffer of size MAXPATHLEN or greater.
Run Code Online (Sandbox Code Playgroud)
因此,要获取与文件描述符关联的文件,您可以使用以下代码段:
#include <sys/syslimits.h>
#include <fcntl.h>
char filePath[PATH_MAX];
if (fcntl(fd, F_GETPATH, filePath) != -1)
{
// do something with the file path
}
Run Code Online (Sandbox Code Playgroud)
因为我永远不记得在哪里MAXPATHLEN定义,我认为PATH_MAX从syslimits会很好.
Mar*_*wis 23
在Windows中,使用GetFileInformationByHandleEx传递FileNameInfo,您可以检索文件名.
Ale*_*lli 15
正如泰勒指出的那样,没有办法"直接可靠地"做你需要的东西,因为给定的FD可能对应于0个文件名(在各种情况下)或> 1(多个"硬链接"是后者的情况通常如何描述).如果你仍然需要具有所有限制的功能(关于速度和获得0,2,......结果而不是1的可能性),这里是你如何做到的:首先,fstat FD - 这告诉你,结果struct stat,文件所依赖的设备,它有多少硬链接,是否是特殊文件等.这可能已经回答了你的问题 - 例如,如果有0个硬链接你会知道实际上没有相应的文件名在磁盘上.
如果统计数据给你带来希望,那么你必须在相关设备上"走树"目录,直到找到所有硬链接(或者只是第一个,如果你不需要多个硬链接,任何一个都会做).为此,你使用readdir(当然还有opendir&c)以递归的方式打开子目录,直到你找到一个struct dirent你原来的同一个inode号struct stat(如果你想要整个路径,而不仅仅是名字,那么)你需要向后走一段目录才能重建它.
如果这种一般方法是可以接受的,但是你需要更详细的C代码,让我们知道,它写起来并不难(尽管如果它没用,我宁愿不写它,也就是说你无法承受不可避免的缓慢性能或者得到的可能性!= 1为您的申请目的的结果;-).
您可以使用fstat()通过struct stat获取文件的inode.然后,使用readdir(),您可以将找到的inode与目录中存在的inode(struct dirent)进行比较(假设您知道目录,否则您将不得不搜索整个文件系统)并找到相应的文件名.讨厌?