c语言,找到你想要的文件,进行复制、盗墓者是个丑奴儿

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

//博主个人网站 :https://daomu.kaige123.com

//打完一波小广告,进入正题

//头文件引入

#include <stdio.h>
#include <unistd.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;

//参数:pathname,opend()打开pathname路径,如果是文件调用:judge()进行文件拷贝,如果是目录调用:str()进行递归目录

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);
        }
}
 

//参数:pathname,readf()对pathname进行递归,如果是文件调用:judge()进行文件拷贝,如果是目录:自调

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);
        }
}

//参数:pathname,pathname是文件的路径

//1:judge对pathname进行拷贝

//2:strstr()先过滤出stu.java

//3:pathname[strlen(pathname)-1]='\0';将最后一个字符/截掉

//4:open打开pathname,read读取内容

//5:open在打开新文件a.txt,O_CREAT如果不存在就创建,O_EXCL如果存在就不创建,0666创建的权限

//6:根据open新打开文件a.txt的文件描述符,write写入open(pathname)读取到的内容

void judge(char * pathname){
        if(strstr(pathname,"stu.java")!=NULL){
        printf("stu.java path : %s \n",pathname);
        pathname[strlen(pathname)-1]='\0';
        int fd=open(pathname,O_RDWR);
        char ar[100]={0};
        read(fd,ar,sizeof(ar));
        int ffd=open("./a.txt",O_RDWR|O_CREAT|O_EXCL,0666);
        write(ffd,ar,strlen(ar));
        close(fd);
        close(ffd);
        }

}
 

//参数:str1,路径,str2,路径,str()作用:拼接路径,并在路径末尾加/

//例:/usr,与home,返回/usr/home/

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;

}
 

运行结果:

1:pwd获得当前路径,ls查看当前路径下的文件(并没有a.txt),编译代码运行可执行文件

2:stu.java path:...,找到了stu.java的所在路径。ls查看当前目录下文件,多了个a.txt,cat查看文件内容,a.txt是stu.java的内容,初步达到结果

猜你喜欢

转载自blog.csdn.net/Java_Dmz/article/details/81232348