日期:2014-05-16  浏览次数:20625 次

遍历目录部分代码请教其含义
程序代码:
#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   direntory:%s\n ",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/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.

你去掉了判断.和..的行, 程序就会找到., 然后无限的对它进行访问, 因为它是指当前目录, 所以会造成死循环.

------解决方案--------------------
你可以这样认为:文件夹里放了一些指向文件或文件夹的指针,每个文件夹在创建时都被系统放入两个特殊的指针 . 和 .. . 指向这个文件夹自己 .. 指向这个文件夹的上级文件夹。

printdir这个函数会遍历文件夹中所有的指针,如果指针指向的又是文件夹,就递归调用本身来遍历这个被指向的文件夹。

注释掉这个if,printdir就会遍历 . 这个指针,然后递归调用本身来遍历 . 指向的文件夹,而 . 指向的文件夹还是这个文件夹,然后就死循环了。