当前位置: 技术问答>linux和unix
遍历目录部分代码请教其含义
来源: 互联网 发布时间:2016-01-27
本文导语: 程序代码: #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 direntory:%sn",dir); return; } chdir(dir); wh...
程序代码:
#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 direntory:%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%sn",depth,"",entry->d_name);
}
chdir("..");
closedir(dp);
}
int main()
{
printf("Directory scan of /home:n");
printdir("/home/httpd",0);
printf("done.n");
exit(0);
}
下面的程序经过编译 运行正常可以遍历目录,仔细阅读不理解其中的代码:
if(strcmp(".",entry->d_name)==0||strcmp("..",entry->d_name)==0)
continue;
我看程序的时候最初觉得没有什么作用故:
/*if(strcmp(".",entry->d_name)==0||strcmp("..",entry->d_name)==0)
continue;*/ 把此行删掉了,之后编译运行,进入了无限循环!我知道这段代码是去除当前目录或者上级子目录,但是我不知道其内涵,为什么要这样做加入此代码?
什么时候entry->d_name="."或".."?
希望高手指教一下! 谢谢
#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 direntory:%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%sn",depth,"",entry->d_name);
}
chdir("..");
closedir(dp);
}
int main()
{
printf("Directory scan of /home:n");
printdir("/home/httpd",0);
printf("done.n");
exit(0);
}
下面的程序经过编译 运行正常可以遍历目录,仔细阅读不理解其中的代码:
if(strcmp(".",entry->d_name)==0||strcmp("..",entry->d_name)==0)
continue;
我看程序的时候最初觉得没有什么作用故:
/*if(strcmp(".",entry->d_name)==0||strcmp("..",entry->d_name)==0)
continue;*/ 把此行删掉了,之后编译运行,进入了无限循环!我知道这段代码是去除当前目录或者上级子目录,但是我不知道其内涵,为什么要这样做加入此代码?
什么时候entry->d_name="."或".."?
希望高手指教一下! 谢谢
|
你在目录下打 ls -a, 就会看到.和..的link了.
.代表当前目录, ..代表上级目录, 这是每个目录项固有的两个link.
你去掉了判断.和..的行, 程序就会找到., 然后无限的对它进行访问, 因为它是指当前目录, 所以会造成死循环.
.代表当前目录, ..代表上级目录, 这是每个目录项固有的两个link.
你去掉了判断.和..的行, 程序就会找到., 然后无限的对它进行访问, 因为它是指当前目录, 所以会造成死循环.
|
你可以这样认为:文件夹里放了一些指向文件或文件夹的指针,每个文件夹在创建时都被系统放入两个特殊的指针 . 和 .. . 指向这个文件夹自己 .. 指向这个文件夹的上级文件夹。
printdir这个函数会遍历文件夹中所有的指针,如果指针指向的又是文件夹,就递归调用本身来遍历这个被指向的文件夹。
注释掉这个if,printdir就会遍历 . 这个指针,然后递归调用本身来遍历 . 指向的文件夹,而 . 指向的文件夹还是这个文件夹,然后就死循环了。
printdir这个函数会遍历文件夹中所有的指针,如果指针指向的又是文件夹,就递归调用本身来遍历这个被指向的文件夹。
注释掉这个if,printdir就会遍历 . 这个指针,然后递归调用本身来遍历 . 指向的文件夹,而 . 指向的文件夹还是这个文件夹,然后就死循环了。