当前位置:  技术问答>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="."或".."?
希望高手指教一下! 谢谢

|
你在目录下打 ls -a, 就会看到.和..的link了.
.代表当前目录, ..代表上级目录, 这是每个目录项固有的两个link.

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

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

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

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

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • c++ stl容器set成员函数介绍及set集合插入,遍历等用法举例
  • jquery遍历筛选数组与遍历解析json对象
  • c++类库Boost.Bimap(遍历,插入,查找,删除)参考代码
  • php遍历数组四种方法 php数组遍历实例
  • c++ stl容器vector删除(erase),遍历等基本用法介绍及头文件
  • 编程技术其它 iis7站长之家
  • java map(HashMap TreeMap)用法:初始化,遍历和排序详解
  • PHP文件遍历小例子
  • c++ STL List查找遍历及各成员函数用法详细介绍
  • C#中遍历DataSet数据集对象实例
  • python内置映射类型(mapping type):dict哈希字典遍历方式及其它用法举例
  • php无限遍历目录代码
  • php遍历目录与其下所有文件
  • jquery进行数组遍历如何跳出当前的each循环
  • jquery遍历checkbox代码与说明
  • 请问怎么用Java实现一个URL的遍历??急!!!!
  • 请问怎样遍历一个hashtable
  • 在遍历目录的情况下如果遇到符号连接…………
  • Shell programme:怎样遍历整个/目录
  • 遍历其文件动态变化的目录
  • 求遍历文件shell


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3