FILE * fd = fopen ("/tmp/12345","wb");
如果我有变量
fd
,如何在 Linux 环境中打印文件路径(/tmp/12345)?你不能只用标准C语言来实现。
在Linux上,您可以执行以下操作:
#include <stdio.h>
#include <unistd.h>
#include <limits.h>
#include <stdlib.h>
int print_filename(FILE *f)
{
char buf[PATH_MAX];
char fnmbuf[sizeof "/prof/self/fd/0123456789"];
sprintf(fnmbuf,"/proc/self/fd/%d", fileno(f));
ssize_t nr;
if(0>(nr=readlink(fnmbuf, buf, sizeof(buf)))) return -1;
else buf[nr]='\0';
return puts(buf);
}
int main(void)
{
FILE * f = fopen ("/tmp/12345","wb");
if (0==f) return EXIT_FAILURE;
print_filename(f);
}
readlink()
函数不会在字符串末尾添加空字符。你需要捕获它返回的值(即包含名称的字节数组的长度),然后在将其作为字符串传递给puts()
之前,添加空字符。 - Jonathan Leffler由于 MacOS 没有 /proc
目录,使用 fcntl
是获取文件描述符路径的一个好选择!
下面是一个可用的示例:
#include <sys/syslimits.h>
#include <fcntl.h>
char filePath[PATH_MAX];
if (fcntl(fd, F_GETPATH, filePath) != -1)
{
printf("%s", filePath);
}
但它仅适用于MacOS,对于Linux,Pskocik的解决方案使用readlink
似乎是最佳答案。
procfs
默认未启用。 - rustyx没有标准方法从FILE *
对象中检索路径名,主要是因为您可能会有未与命名文件相关联的流(stdin
、stdout
、stderr
、管道等)。各平台可以提供从流中获取路径的实用程序,但您需要查阅该平台的文档。
否则,您需要手动跟踪该信息。
FILE*
获取文件名?等问题的重复。 - jww