程序思路:读取当前目录、一个目录接着一个目录地沿着树向上追踪,每步查看当前目录的i节点号,然后在父目录查找该i节点号的名字(目录名),直到到达目录树的顶端。
程序步骤:
得到当前目录(.目录)的i节点号。(该 i节点号称为 n)
切换到当前目录的父目录(..目录)。
找到i节点号n链接的目录名。
重复以上步骤,直到达到目录树。
判断是否到达目录树顶端(当 . 和 .. 的i节点相同时,就可以认为已经到达文件树的顶端)。
关于目录名字的显示:
第一种方法,建立一个循环,使用 strcat 或 sprintf 建立目录名字的字符串序列。
第二种办法,通过一个递归的程序逐步到达树的顶端来一个接一个的显示目录名。
示例代码:
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
#include <stdlib.h>
#include <string.h>
// ino_t = unsigned long int
ino_t get_inode(char *);
void printpathto(ino_t);
void inum_to_name(ino_t , char *, int);
int main(){
printpathto(get_inode("."));
putchar('\n');
return 0;
}
//打印以 this_inode 作为当前目录的绝对路径
void printpathto(ino_t this_inode){
ino_t my_inode;
char its_name[BUFSIZ]; //BUFSIZ = 8192
if(get_inode("..") != this_inode){ // 判断是否到达文件的顶端
chdir(".."); //改变工作目录,等同于 cd ..
inum_to_name(this_inode,its_name,BUFSIZ); //将 this_inode 转换成名字
my_inode = get_inode("."); //获取节点号
printpathto(my_inode); //递归调用(新的节点)
printf("/%s",its_name); // 这个目录的名字(当目录为顶层目录才执行)
}
}
// 将 inode_to_find i节点转换成对应文件名。
void inum_to_name(ino_t inode_to_find, char *namebuf, int buflen){
DIR *dir_ptr;
struct dirent *direntp;
dir_ptr = opendir(".");
if(dir_ptr == NULL){
perror(".");
exit(1);
}
while((direntp = readdir(dir_ptr)) != NULL)
if(direntp->d_ino == inode_to_find){
strncpy(namebuf,direntp->d_name,buflen);
namebuf[buflen - 1] = '\0';
closedir(dir_ptr);
return ;
}
fprintf(stderr,"error looking for inum %ld\n",inode_to_find);
exit(1);
}
//获取文件名对应的 i节点
ino_t get_inode(char *fname){
struct stat info;
if(stat(fname,&info) == -1){
fprintf(stderr,"Cannot stat ");
perror(fname);
exit(1);
}
return info.st_ino;
}