比如我在Linux系统下创建了一个如下文件 /test/aa/bb/cc,又给目录文件aa创建了一个符号链接/test/linkaa,C语言怎么获取/test/linkaa/bb目录的实际路径?我试了下linux命令可以通过readlink -f /testlinkaa/bb获取,而C函数readlink( )好像只能获取/test/linkaa的,获取不到//test/linkaa/bb的,也就是说readlink( )函数路径的最后一级必须是符号链接才行。怎么通过C代码获取/test/linkaa/bb的真实路径呢?
谢谢各位,我自己写了段代码实现了。
char get_exe_path(const char link_path, char* real_path, int count)
{
int i = 0;
int result = readlink(link_path, real_path, count-1);
if( (result < 0) || (result >= count-1) )
{
return NULL;
}
real_path[result] = '\0';
return real_path;
}
char *left(char *dst, const char *src, int n)
{
const char *p = src;
char *q = dst;
int len = strlen(src);
if (n > len)
n = len;
while(n--)
*(q++) = *(p++);
*(q++)='\0';
return dst;
}
char *right(char *dst, const char *src, int n)
{
const char *p = src;
char *q = dst;
int len = strlen(src);
if (n > len)
n = len;
p += (len - n);
while (*(q++) = *(p++));
return dst;
}
void get_real_path(const char *linkpath, char *realpath)
{
char tmppath[1024], left_path[1024], right_path[1024];
char *tmpbuf;
int tmplen, rightlen = 0;
if (get_exe_path(linkpath, realpath, 1024))
{
return;
}
strcpy(tmppath, linkpath);
while (NULL != (tmpbuf = strrchr(tmppath, '/')))
{
tmplen = strlen(tmpbuf);
rightlen += tmplen;
left(left_path, tmppath, strlen(tmppath) - tmplen);
if (get_exe_path(left_path, realpath, 1024))
{
right(right_path, linkpath,rightlen);
strcat(realpath, right_path);
return;
}
strcpy(tmppath, left_path);
}
strcpy(realpath, linkpath);
return;
}
凡是用命令能获取的,一律可以用
system("命令>~/tmp.txt");
然后读文件~/tmp.txt的内容的办法获取
把/test/linkaa/bb拆分为两段,/test/linkaa/ 和 bb
首先根据/test/linkaa/读取出真实路径/test/aa/
其次拼接/test/aa/ 和 bb。
最终得到/test/aa/bb。
可以参考下文
https://www.coder.work/article/1543841
相关函数:stat, lstat, symlink
头文件:#include
定义函数:int readlink(const char * path, char * buf, size_t bufsiz);
函数说明:readlink()会将参数path 的符号连接内容存到参数buf 所指的内存空间, 返回的内容不是以NULL作字符串结尾, 但会将字符串的字符数返回. 若参数bufsiz 小于符号连接的内容长度, 过长的内容会被截断.
返回值:执行成功则传符号连接所指的文件路径字符串, 失败则返回-1, 错误代码存于errno.