获取文件的绝对路径

evg*_*nka 39 c unix filesystems path absolute

如何在Unix上将相对路径转换为C中的绝对路径?这有一个方便的系统功能吗?

在Windows上有一个GetFullPathName功能可以完成这项工作,但我在Unix上找不到类似的东西......

xsl*_*xsl 48

使用realpath().

realpath()函数应从指向的路径名派生出 file_name一个名称相同文件的绝对路径名,其分辨率不涉及.",..",或符号链接.生成的路径名应存储为{PATH_MAX} 指向的缓冲区中以空字符结尾的字符串,最多为字节 resolved_name.

如果resolved_name是空指针,则行为realpath()是实现定义的.


以下示例为symlinkpath参数标识的文件生成绝对路径名.生成的路径名存储在actualpath数组中.

#include <stdlib.h>
...
char *symlinkpath = "/tmp/symlink/file";
char actualpath [PATH_MAX+1];
char *ptr;


ptr = realpath(symlinkpath, actualpath);
Run Code Online (Sandbox Code Playgroud)

  • "加一"不是必需的,因为它不会造成任何伤害. (9认同)
  • 实际路径包含绝对路径,但ptr包含什么? (3认同)
  • Windows上的`GetFullPathName`也适用于不存在的文件.`realpath`需要存在的路径.当您想要创建路径或文件时,这种情况很糟糕. (2认同)
  • @EML +1 不是必需的。来自 POSIX limit.h 的基本原理:“IEEE PASC Interpretation 1003.1 #15 解决了标准中路径名定义和 {PATH_MAX} 描述的不一致问题,允许应用程序开发人员分配 {PATH_MAX} 或 {PATH_MAX}+1 个字节。通过更正 {PATH_MAX} 定义以包含空字符,消除了不一致问题。通过此更改,之前分配了 {PATH_MAX} 字节的应用程序将继续成功。” (2认同)

Sco*_*ang 8

尝试realpath()一下stdlib.h

char filename[] = "../../../../data/000000.jpg";
char* path = realpath(filename, NULL);
if(path == NULL){
    printf("cannot find file with name[%s]\n", filename);
} else{
    printf("path[%s]\n", path);
    free(path);
}
Run Code Online (Sandbox Code Playgroud)