一个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;
} 展开
#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;
} 展开
3个回答
展开全部
因为为了让程序变得准确可行。
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
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
展开全部
最近也遇到了这个问题,但是有些想不通,chdir(dir)后续的程序,并没有更改某个量,readdir还是获取的dir的目录流,和进入该目录有什么关联吗
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
chdir(dir);是为了在程序刚运行时进入指定的目录,以及接下来递归时进入相应子目录;
chdir("..");是为了在递归完某一子目录后,退回到其父目录继续遍历后续的普通文件或其他子目录;如果缺少这一语句,那么while循环中的递归printdir将会把父目录中后续的普通文件当作目录来操作,从而造成“无法打开目录”这种错误。
【以上只是个人观点,但愿能帮到你^_^】
追问
谢谢,想明白了,不过还有个疑问,为什么取消chdir("..");后,程序依然可以遍历父目录中后续的普通文件,然后之后加上一句“无法打开目录”
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询