当前位置: 技术问答>linux和unix
求助:遍历目录
来源: 互联网 发布时间:2016-06-22
本文导语: #include #include #include #include #include #include void printdir(char *dir, int depth) { DIR *dp; struct dirent *entry; struct stat statbuf; if((dp = opendir(dir)) == NULL) { fprintf(stderr, "cannot...
#include
#include
#include
#include
#include
#include
void printdir(char *dir, int depth)
{
DIR *dp;
struct dirent *entry;
struct stat statbuf;
if((dp = opendir(dir)) == NULL)
{
fprintf(stderr, "cannot open directory: %sn", dir);
return;
}
chdir(dir);
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:n");
printdir("/home",0);
printf("done.n");
exit(0);
}
这个程序是遍历/home目录及其子目录下的所有文件
为什么要进入子目录才可以呢?原因何在?
#include
#include
#include
#include
#include
void printdir(char *dir, int depth)
{
DIR *dp;
struct dirent *entry;
struct stat statbuf;
if((dp = opendir(dir)) == NULL)
{
fprintf(stderr, "cannot open directory: %sn", dir);
return;
}
chdir(dir);
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:n");
printdir("/home",0);
printf("done.n");
exit(0);
}
这个程序是遍历/home目录及其子目录下的所有文件
为什么要进入子目录才可以呢?原因何在?
|
你从程序的执行结果就可以看出来,语句printf("%*s%s/n", depth,"",entry->d_name); 打印的仅仅是目录或文件的
名称(例如/home下的jackzhou,neil这样的目录名),并不包括它的绝对路径,这说明d_name这个char[]中存放的只是这
个目录或文件的名称。那递归调用printdir(entry->d_name, depth+4); 进入的就是jackzhou这样的目录了,相当于printdir("jackzhou", depth+4)调用。如果你没有事先的语句chdir(dir)切换到/home下,以及递归完一次后用chdir("..")切回上层目录,那这个jackzhou当然只能从当前工作目录下找了,找不到的话当然就会出错了。
名称(例如/home下的jackzhou,neil这样的目录名),并不包括它的绝对路径,这说明d_name这个char[]中存放的只是这
个目录或文件的名称。那递归调用printdir(entry->d_name, depth+4); 进入的就是jackzhou这样的目录了,相当于printdir("jackzhou", depth+4)调用。如果你没有事先的语句chdir(dir)切换到/home下,以及递归完一次后用chdir("..")切回上层目录,那这个jackzhou当然只能从当前工作目录下找了,找不到的话当然就会出错了。
|
opendir()的参数要是绝对路径,如果不是的话,他会在现在的工作目录搜索相应的d_name文件。
所以如果不chdir改变工作目录,原本文件名是“/home/usrname/”就会变成“usrname/”,所以打不开文件。
所以如果不chdir改变工作目录,原本文件名是“/home/usrname/”就会变成“usrname/”,所以打不开文件。
|
嗯如果没有chdir的话,将遍历的是整个/目录下的所有的文件。
|
jinwei1984
你打不开/home,可能是因为权限问题吧。不过我比较奇怪,一般/home都是可读的。
zhoudaxia正解,chdir是因为递归的关系。
你打不开/home,可能是因为权限问题吧。不过我比较奇怪,一般/home都是可读的。
zhoudaxia正解,chdir是因为递归的关系。