c语言,查找.Java后缀文件、盗墓者是个丑奴儿

//盗墓者是个丑奴儿,原

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <ctype.h>
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/types.h>
#include <dirent.h>
#include <dirent.h>

//函数原型申明

int opend(const char * pathname);
void judge(char * pathname);
char * str(const char * str1,const char * str2);
void readf(const char * pathname);

DIR * dir=NULL;

 

//opendir打开输入参数的目录,获得指针交给readdir读取目录下的文件

int opend(const char * pathname){
        dir=opendir(pathname);
        if(dir==NULL)
        return -1;
        struct dirent * reado=NULL;
        while((reado=readdir(dir))!=NULL){
                char * tmps=NULL;
                if(reado->d_name[0]=='.')
                continue;
                tmps=str(pathname,reado->d_name);
                if(reado->d_type==DT_DIR){
                        readf(tmps);
                }else{
                        judge(tmps);
                }
                if(reado==NULL)
                free(tmps);
        }
}

//递归打开目录,是目录在自调

void readf(const char * pathname){
        DIR * dir=opendir(pathname);
        struct dirent * reado=NULL;
        while((reado=readdir(dir))!=NULL){
                char * tmps=NULL;
                if(reado->d_name[0]=='.')
                continue;
                tmps=str(pathname,reado->d_name);
                if(reado->d_type==DT_DIR){
                        readf(tmps);
                }else{
                        judge(tmps);
                }
                if(reado==NULL)
                free(tmps);
        }
}

 

//opend与readf函数都有readdir读取,显然代码重复了,但是在一个函数完成。会存在有一个问题

//存在的问题:即要一直保持着输入的路径参数!又要完成对其他目录的读取。假设传参../那么即要完成对../下的目录读取。又要去读取../中的子目录里面的子目录。opendir就会存在问题。

//我分2个函数读取,opend保持输出的路径目录,只读取输入参数下的目录。如果还有目录路径就自调

 

 

//参数:字符串,从参数字符串搜索字符串.Java。来判断文件是否是.Java文件

void judge(char * pathname){
        if(strstr(pathname,".java")!=NULL)
        printf("%s \n",pathname);
}

 

//路径拼接。如:str1参数../,str2参数test。拼接返回../test/。拼接出绝对路径,方便取得路径去open与read

char * str(const char * str1,const char * str2){
        int size1=strlen(str1);
        int size2=strlen(str2);
        char * arr=(char *)malloc(size1+size2+2);
        memset(arr,'0',size1+size2);
        memcpy(arr,str1,size1);
        memcpy(&(arr[size1]),str2,strlen(str2));
        arr[size1+size2]='/';
        return arr;
}

 

//main测试

int main(int arg,char ** arv){

        if(arv[1]!=NULL)
        opend(arv[1]);

        return 0;

}
 

运行结果:

也会有报错情况:

切换root用户对ect再次检索,没有报错。报错分析:1、目录不允许访问,2、代码处理不妥

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值