⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 myfind.c

📁 根据用户输入的命令行选项的不同
💻 C
字号:
#include "apue.h"
#include  <dirent.h>
#include <limits.h>
#include <fcntl.h>
#include <sys/stat.h>
#define MAXSIZE 4096


typedef int Myfunc(const char *,const struct stat *,int);
static Myfunc myfunc,myfunc1,myfunc2;
static int myftw(char *,Myfunc *);
static int dopath(Myfunc *);
static int f1,temp;     //temp为全局变量记录argc
static struct stat filebuf;  //指向argv[3]的结构体
static char *buf[10];
static char filename[50];
static long nreg,ndir,nblk,nchr,nfifo,nslink,nsock,ntot,n4096;

int main(int argc,char *argv[]){
	int ret,i;
	if(argc==2){
	   ret=myftw(argv[1],myfunc);
	   ntot=nreg+ndir+nblk+nchr+nfifo+nslink+nsock+n4096;
	   if(ntot==0)  ntot=1;
	   printf("regular files =%7ld,%5.2f %%\n",nreg,nreg*100.0/ntot);
	   printf("direcrories   =%7ld,%5.2f %%\n",ndir,ndir*100.0/ntot);
	   printf("block special =%7ld,%5.2f %%\n",nblk,nblk*100.0/ntot);
	   printf("char special  =%7ld,%5.2f %%\n",nchr,nchr*100.0/ntot);
	   printf("FIFOS         =%7ld,%5.2f %%\n",nfifo,nfifo*100.0/ntot);
	   printf("symbolic links=%7ld,%5.2f %%\n",nslink,nslink*100.0/ntot);
	   printf("sockets       =%7ld,%5.2f %%\n",nsock,nsock*100.0/ntot);
	   printf("4096          =%7ld,%5.2f %%\n",n4096,n4096*100.0/nreg);
    }
	else if(argc==4&&strcmp(argv[2],"-comp")==0){
        if((f1=open(argv[3],O_RDONLY,S_IRUSR))<0)
			err_ret("can not open %s",argv[3]);
		if(fstat(f1,&filebuf)<0) return(myfunc(argv[1],&filebuf,4));
		ret=myftw(argv[1],myfunc1);
		
	}
	else if(argc>=4&&strcmp(argv[2],"-name")==0){
        for(i=0;i<argc-3;i++)  buf[i]=argv[3+i];
        temp=argc-3;
        ret=myftw(argv[1],myfunc2);
	}
	exit(ret);
}

#define FTW_F 1
#define FTW_D 2
#define FTW_DNR 3
#define FTW_NS 4

static char *fullpath;


static int myftw(char *pathname,Myfunc *func){
       int len;
       fullpath=path_alloc(&len);
       strncpy(fullpath,pathname,len);
       fullpath[len-1]=0;
       return(dopath(func));
}

static int dopath(Myfunc *func){
    struct stat statbuf;
    struct dirent *dirp;
    DIR *dp;
    int ret;
    char *ptr;

    if(lstat(fullpath,&statbuf)<0)
       return(func(fullpath,&statbuf,FTW_NS));
    if(S_ISDIR(statbuf.st_mode)==0)
       return(func(fullpath,&statbuf,FTW_F));

    if((ret=func(fullpath,&statbuf,FTW_D))!=0) return(ret);

    ptr=fullpath+strlen(fullpath);
    *ptr++='/';
    *ptr=0;

    if((dp=opendir(fullpath))==NULL)
       return(func(fullpath,&statbuf,FTW_DNR));

    while ((dirp=readdir(dp))!=NULL) {
	    if(strcmp(dirp->d_name,".")==0||strcmp(dirp->d_name,"..")==0) continue;
	    strcpy(ptr,dirp->d_name);
	    strcpy(filename,dirp->d_name);
	    if((ret=dopath(func))!=0) break;
	}
    ptr[-1]=0;
    if(closedir(dp)<0) err_ret("can't close directory %s",fullpath);
    return(ret);
}

int fullconvert(char *pathname){
     char filebuf[100],filebuf1[100],*p=pathname,*q;
     getcwd(filebuf,sizeof(filebuf));
     if(*p!='/'){
        if(*p=='.') p++;
       	else strcat(filebuf,"/");
        if(*p=='.') {
	   p++;
           q=filebuf+strlen(filebuf)-1;
	   while(*q!='/') q--;
	   *q='\0';
	}
        strcat(filebuf,p);
       strcpy(filebuf1,filebuf);
       printf("%s\n",filebuf1);
     }
     else printf("%s\n",pathname);
     return 1;
}

static int myfunc(const char *pathname,const struct stat *statptr,int type){
	switch(type) {
	case FTW_F:
		switch (statptr->st_mode&S_IFMT){
		case S_IFREG:
			nreg++;
			if(statptr->st_size<=4096) n4096++;
			break;
		case S_IFBLK:nblk++; break;
		case S_IFCHR:nchr++; break;
		case S_IFIFO:nfifo++;break;
		case S_IFLNK:nslink++;break;
		case S_IFSOCK:nsock++;break;
		case S_IFDIR:
			err_dump("for S_IFDIR for %s",pathname);
		
		}
		
		break;
	case FTW_D:ndir++;
		break;
	/*case FTW_DNR: err_ret("can't read directory %s",pathname);
		break;
		*/
        case FTW_NS:
		err_ret("stat error for %s",pathname);
		break;
		
	default: err_dump("unknown type %d for pathname %s",type,pathname);
	}
	return(0);
}  //myfunc


static int myfunc1(const char *pathname,const struct stat *statptr,int type){
    int f3,count,buffersize=1024,n1,n2;
    char c1,c2,tempbuf1[MAXSIZE],tempbuf2[MAXSIZE];
    switch(type) {
    case FTW_F:
    if(statptr->st_size==filebuf.st_size){
       if((f3=open(fullpath,O_RDONLY,S_IRUSR))<0)
	   err_ret("can not open %s",pathname);
        count=0;
 while((n1=read(f1,tempbuf1,buffersize))>0&&(n2=read(f3,tempbuf2,buffersize))>0)     {  
         if(strcmp(tempbuf1,tempbuf2)!=0) break;
         count+=n1;
     }
	if(count>=filebuf.st_size) {
           
           fullconvert((char *)pathname);     
        }
	close(f3);
   }
    lseek(f1,0,SEEK_SET);
		

      break;
      
   }
   return 0;
}  //mufunc1

static int myfunc2(const char *pathname,const struct stat *statptr,int type){
	
	int i;char filebuf[100];
	getcwd(filebuf,sizeof(filebuf));
	if(type==FTW_F){
        for(i=0;i<temp;i++) 
		if(strcmp(buf[i],filename)==0) {
		         fullconvert((char *)pathname);

                }
	}
        return 0;
}  //mufunc2

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -