2024-04-24 07:44:37 发布
网友
在Windows中,通过GetFileInformationByHandleEx,传递FileNameInfo,可以检索文件名。
您可以在/proc/self/fd/NNN上使用^{},其中NNN是文件描述符。这将为您提供打开时的文件名—但是,如果文件从那时起被移动或删除,则可能不再准确(尽管Linux在某些情况下可以跟踪重命名)。要验证,stat给定的文件名和fstatfd,并确保st_dev和st_ino是相同的。
/proc/self/fd/NNN
stat
fstat
st_dev
st_ino
当然,并非所有的文件描述符都引用文件,对于那些文件,您将看到一些奇怪的文本字符串,例如pipe:[1538488]。因为所有的真实文件名都是绝对路径,所以您可以很容易地确定哪些是绝对路径。此外,正如其他人所指出的,文件可以有多个指向它们的硬链接-这将只报告它是用哪个打开的。如果要查找给定文件的所有名称,只需遍历整个文件系统。
pipe:[1538488]
我在Mac OS X上遇到了这个问题。我们没有/proc虚拟文件系统,因此接受的解决方案无法工作。
/proc
相反,我们有一个用于fcntl的F_GETPATH命令:
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是在哪里定义的,所以我认为来自syslimits的PATH_MAX是可以的。
MAXPATHLEN
PATH_MAX
在Windows中,通过GetFileInformationByHandleEx,传递FileNameInfo,可以检索文件名。
您可以在} ,其中NNN是文件描述符。这将为您提供打开时的文件名—但是,如果文件从那时起被移动或删除,则可能不再准确(尽管Linux在某些情况下可以跟踪重命名)。要验证,
/proc/self/fd/NNN
上使用^{stat
给定的文件名和fstat
fd,并确保st_dev
和st_ino
是相同的。当然,并非所有的文件描述符都引用文件,对于那些文件,您将看到一些奇怪的文本字符串,例如
pipe:[1538488]
。因为所有的真实文件名都是绝对路径,所以您可以很容易地确定哪些是绝对路径。此外,正如其他人所指出的,文件可以有多个指向它们的硬链接-这将只报告它是用哪个打开的。如果要查找给定文件的所有名称,只需遍历整个文件系统。我在Mac OS X上遇到了这个问题。我们没有
/proc
虚拟文件系统,因此接受的解决方案无法工作。相反,我们有一个用于
fcntl
的F_GETPATH
命令:因此,要获取与文件描述符关联的文件,可以使用以下代码段:
因为我不记得
MAXPATHLEN
是在哪里定义的,所以我认为来自syslimits的PATH_MAX
是可以的。相关问题 更多 >
编程相关推荐