编写 pwd

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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值