ls -R 的递归实现
LinuxC文件操作
递归
动态数组
之前对递归和动态数组用的不是很多,可能理解已不是很深
这一次实现ls -R的递归刚好巩固了自己的薄弱点
下面主要是重新梳理一下之前的逻辑
不说说了,先放码:
void display_dir(int flag,char*name)
{
DIR * dir;
struct dirent *ptr;
int i,count = 0;
struct stat buf;
char name_dir[10000];
if(chdir(name)<0) //将输入的目录改为当前目录,下面操作的前提
{
my_err("chdir",__LINE__);
}
if(getcwd(name_dir,10000)<0){
my_err("getcwd",__LINE__); //获取当前目录的绝对路径(重要,下面的打开目录的操作需要这个路径,否则需要手动添加)
}
printf("%s:\n",name_dir);
dir = opendir(name_dir); //用新获得的路径打开目录
if(dir==NULL){
my_err("opendir",__LINE__);
}
while((ptr = readdir(dir))!=NULL){
if(f_maxlen<strlen(ptr->d_name))
f_maxlen = strlen(ptr->d_name);
count++;
}
closedir(dir);
//动态数组
char**filenames =(char**)malloc(count*sizeof(char*)); //要进行初始化
memset(filenames,0,sizeof(char*)*count);
for(i=0;i<count;i++){
filenames[i]=(char*)malloc(256*sizeof(char));
memset(filenames[i],0,sizeof(char)*256);
}
int j,len=strlen(name_dir);
dir = opendir(name_dir);
for(i=0;i<count;i++){
ptr = readdir(dir);
if(ptr == NULL){
my_err("readdir",__LINE__);
}
strcat(filenames[i],ptr->d_name); //这里要注意用之前的初始化
}
for(i=0;i<count;i++)
display_file(flag,filenames[i]);
printf("\n");
if(flag>3){ //递归实现核心部分
for(i=0;i<count;i++){
if(lstat(filenames[i],&buf)==-1)
{
my_err("stat",__LINE__);
}
if(strcmp(filenames[i],"..")==0)
continue;
if(strcmp(filenames[i],".")==0)
continue;
if(S_ISDIR(buf.st_mode)){
display_dir(flag,filenames[i]);
}
else if(!S_ISDIR(buf.st_mode))
{
continue;
}
chdir("../"); //处理完一个目录后返回上一层
}
}
for(i=0;i<count;i++)
{
free(filenames[i]);
}
free(filenames);
closedir(dir); //在函数开始时打开,结束时关闭
}