是否有可能在C中获得文件描述符(Linux)的文件名?
发布于 2009-07-27 17:38:32
您可以在/proc/self/fd/NNN
上使用readlink
,其中NNN是文件描述符。这将为您提供打开文件时的文件名-但是,如果文件在那之后被移动或删除,它可能不再准确(尽管Linux在某些情况下可以跟踪重命名)。要进行验证,请对给定的文件名执行stat
操作,并对您拥有的fd执行fstat
操作,并确保st_dev
和st_ino
相同。
当然,并不是所有的文件描述符都引用文件,对于这些文件,您会看到一些奇怪的文本字符串,比如pipe:[1538488]
。因为所有的真实文件名都是绝对路径,所以您可以轻松地确定哪些是绝对路径。此外,正如其他人所指出的,文件可以有多个指向它们的硬链接-这将只报告它打开时使用的硬链接。如果要查找给定文件的所有名称,只需遍历整个文件系统。
发布于 2012-11-25 02:52:58
我在Mac上遇到了这个问题,我们没有/proc
虚拟文件系统,所以被接受的解决方案不能工作。
相反,我们有一个用于fcntl
的F_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
是在什么地方定义的,所以我认为来自系统限制的PATH_MAX
就可以了。
发布于 2009-07-27 15:20:19
在Windows中,使用GetFileInformationByHandleEx,传递FileNameInfo,您可以检索文件名。
https://stackoverflow.com/questions/1188757
复制相似问题