一个linux下目录遍历函数,有个问题,chdir(dir);chdir("..")这两句为什么变更目录

#include<sys/types.h>#include<sys/stat.h>#include<dirent.h>#include<stdio.h>voidprint... #include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
#include <stdio.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);
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");
return 0;

}
展开
 我来答
东哥zld
推荐于2016-05-04 · 机械自动化爱好者
东哥zld
机械自动化爱好者
采纳数:204 获赞数:17738
毕业不久,正在努力创造自己的骄傲

向TA提问 私信TA
展开全部
因为为了让程序变得准确可行。
  1、chdir("..");是为了在递归完某一子目录后,退回到其父目录继续遍历后续的普通文件或其他子目录;如果缺少这一语句,那么while循环中的递归printdir将会把父目录中后续的普通文件当作目录来操作,从而造成“无法打开目录”这种错误。
  2、chdir(dir);是为了在程序刚运行时进入指定的目录,以及接下来递归时进入相应子目录;

用`pwd`提取的绝对路径。
  [gag@genomic-server tmp]$ more test1
  #!/usr/bin/perl -w
  # script name is test
  use strict;
  my $d="/home/gag";
  my $now=`pwd`;
  print $now,"\n";
  chdir $d;
  print `pwd`;print `ls`;
  `touch iamhere`;
  print "#######################\n";
  chdir $now;print `pwd`;
  `touch iamherethen`;
  [gag@genomic-server tmp]$ perl test1
  /home/gag/perl/tmp
  /home/gag
  c
  cpp1
  cpp2
  java
  perl
  shell
  tools
  #######################
  /home/gag
  [gag@genomic-server tmp]$ ls
  test1
  [gag@genomic-server tmp]$ ls ../../
  c cpp1 cpp2 iamhere iamherethen java perl shell tools
偌记忆zpb
2019-08-23
知道答主
回答量:6
采纳率:100%
帮助的人:4084
展开全部
最近也遇到了这个问题,但是有些想不通,chdir(dir)后续的程序,并没有更改某个量,readdir还是获取的dir的目录流,和进入该目录有什么关联吗
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
DK小黑
推荐于2016-02-01 · TA获得超过339个赞
知道小有建树答主
回答量:96
采纳率:100%
帮助的人:84万
展开全部
  1. chdir(dir);是为了在程序刚运行时进入指定的目录,以及接下来递归时进入相应子目录;

  2. chdir("..");是为了在递归完某一子目录后,退回到其父目录继续遍历后续的普通文件或其他子目录;如果缺少这一语句,那么while循环中的递归printdir将会把父目录中后续的普通文件当作目录来操作,从而造成“无法打开目录”这种错误。

【以上只是个人观点,但愿能帮到你^_^】

追问
谢谢,想明白了,不过还有个疑问,为什么取消chdir("..");后,程序依然可以遍历父目录中后续的普通文件,然后之后加上一句“无法打开目录”
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式