编写 pwd

来源:互联网 发布:django 遍历数组前五个 编辑:程序博客网 时间:2024/05/26 09:53

程序思路:读取当前目录、一个目录接着一个目录地沿着树向上追踪,每步查看当前目录的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 intino_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;}


0 0
原创粉丝点击