一个linux下遍历目录的程序,其中为什么调用chdir()

zp37 发布于 2017/02/10 14:27
阅读 241
收藏 0

#include <unistd.h>
#include <stdio.h>
#include <dirent.h>
#include <string.h>
#include <sys/stat.h>
#include <stdlib.h>

void printdir(char *dir,int depth){
    DIR *dp;
    struct dirent *entry;
    struct stat statbuf;

    if((dp=opendir(dir))==NULL){
        fprintf(stderr,"cannot open directory: %s \n", dir);
        return;
    }
    chdir(dir);    /////这个地方为什么要改变当前工作目录?

/////当前工作目录会对readdir()和opendir()的执行有影响吗?
    while((entry=readdir(dp))!=NULL){
        lstat(entry->d_name, &statbuf);
        if(S_ISDIR(statbuf.st_mode)){
            if(strcmp(".",entry->d_name)==0 ||
                    strcmp("..",entry->d_name)==0){
                continue;
            }
            printf("%*s%s/\n",depth," ",entry->d_name);
            printdir(entry->d_name,depth+4);
        }
        else printf("%*s%s\n",depth," ",entry->d_name);
    }
    chdir("..");
    closedir(dp);
}

int main(){
    printf("Directory scan of /home/zp37/workspace2 \n");
    printdir("/home/zp37/workspace2",0);
    printf("done \n");
    exit(0);
}

《linux程序设计(第四版)》中的例子

 

加载中
0
Lin_R
Lin_R

楼主的程序是有目录递归功能的,相应代码在程序第25行: printdir(entry->d_name,depth+4); 

可以看到它在递归时,传进去的是目标目录下的目录名,是一个相对路径,所以需要先chdir(dir)到目的目录才能完成对相对路径的再一次open(dir), read(dir), 否则要么去掉递归, 要么拼接成绝对路径传入函数

0
zp37
zp37

谢谢指点,我之前理解不到位,以为entry->d_name是一个绝对路径

返回顶部
顶部