阿杰 发表于 2011-6-22 21:48:54

vc++编写文件搜索类

一个文件搜索类,可以递归查找和模糊匹配的,花了点时间写了下,用一个链表保存文件信息。最后用releasefile释放这个链表。
#include <iostream>
#include "windows.h"
using namespace std;
class file{
public:
        file(char *,int);
        ~file();
        void getfilename(char*);
        void getdir(char*);
        void getfullname(char*);
        void getext(char*);
        void getname(char*);
        int gettype();
        file *next;
        int getlength();
private:
        char *fullname;
        int type;
};
class filesearch{
public:
file*        search(char *,char *,int,int);
file*        subfolders(char *);
file* subfiles(char *);
file*subff(char *);
void   releasefile(file*);
};
file::file(char *path,int t){
        fullname=new char;
        strcpy(fullname,path);
        type=t;
}
file::~file(){
        delete[] fullname;
}
void file::getfilename(char* name){
        int i=strlen(fullname)-1;
        while(i>=0){
                if(fullname=='\\' || fullname=='/'){
                        strcpy(name,fullname+i+1);
                        return;
                }
                i--;
        }
        strcpy(name,"");
}
void file::getdir(char* dir){
        char *s=new char;
        getfilename(s);
        int c=strlen(fullname)-strlen(s)-1;
        strncpy(dir,fullname,c);
        dir=0;
        delete[] s;
}
void file::getfullname(char* name){
        strcpy(name,fullname);
}
void file::getext(char* ext){
        char *s=new char;
        getfilename(s);
        int i=strlen(s)-1;
        while(i>=0){
                if(s=='.'){
                        strcpy(ext,s+i+1);
                        return;
                }
                i--;
        }
        strcpy(ext,"");
        delete[] s;
}
void file::getname(char* name){
        int i=strlen(fullname)-1;
        while(i>=0){
                if(fullname=='\\' || fullname=='/'){
                        i++;
                        int i1=0;
                        while(fullname){
                       
                                if(fullname=='.'){
                                        name=0;
                                        return;
                                }else{
                                        name=fullname;
                                }
                                i++;
                        }
                        name=0;
                        return;
                       
                }
                i--;
        }
        strcpy(name,"");
}
int file::gettype(){
return type;
}
int file::getlength(){
        return strlen(fullname);
}
file* filesearch::subff(char *path){
        WIN32_FIND_DATA data;
        char tpath;
        strcpy(tpath,path);
        strcat(tpath,"\\*");
        HANDLE h=FindFirstFile(tpath,&data);
        FindNextFile(h,&data);
                file *ff=0;
                file *head=0;
                while(FindNextFile(h,&data)){
                        char name;
                        strcpy(name,path);
                        strcat(name,"\\");
                        strcat(name,data.cFileName);
                        file* ff1=new file(name,data.dwFileAttributes);
                        ff1->next=0;
                        if(ff!=0){
                                ff->next=ff1;
                                ff=ff1;
                        }else{
                                ff=ff1;
                                head=ff;
                        }
                       
                        if(data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY){
                                file* ff2=subff(name);
                                if(ff2){
                                ff1->next=ff2;
                                while(ff2->next!=0){
                                        ff2=ff2->next;
                                }
                                ff=ff2;
                                }
                        }
                       
                }
                FindClose(h);
                return head;
}
void filesearch::releasefile(file* f){
        while(f){
                file *f1=f;
                f=f->next;
                delete f1;
        }
}
file *filesearch::search(char *dir,char *name,int r,int reg){
file *f=subff(dir);
file *f1=0;
file *head=0;
if(f){
       
        if(r){
                if(reg){
                        while(f){
                                char a;
                                f->getfilename(a);
                                if(strstr(a,name)){
                                        char fullname;
                                        f->getfullname(fullname);
                                        file *ff2=new file(fullname,f->gettype());
                                        ff2->next=0;
                                        if(f1){
                                                f1->next=ff2;
                                                f1=ff2;
                                        }else{
                                                f1=ff2;
                                                head=f1;
                                        }
                                }
                                f=f->next;
                        }
                }else{
                        while(f){
                                char a;
                                f->getfilename(a);
                                if(stricmp(a,name)==0){
                                        char fullname;
                                        f->getfullname(fullname);
                                        file *ff2=new file(fullname,f->gettype());
                                        ff2->next=0;
                                        if(f1){
                                                f1->next=ff2;
                                                f1=ff2;
                                        }else{
                                                f1=ff2;
                                                head=f1;
                                        }
                                }
                                f=f->next;
                        }
                }
        }else{
                if(reg){
                        while(f){
                                char a,d;
                                f->getfilename(a);
                                f->getdir(d);
                                if(strstr(a,name) && stricmp(d,dir)==0){
                                        char fullname;
                                        f->getfullname(fullname);
                                        file *ff2=new file(fullname,f->gettype());
                                        ff2->next=0;
                                        if(f1){
                                                f1->next=ff2;
                                                f1=ff2;
                                        }else{
                                                f1=ff2;
                                                head=f1;
                                        }
                                }
                                f=f->next;
                        }
                }else{
                        while(f){
                                char a,d;
                                f->getfilename(a);
                                f->getdir(d);
                                if(stricmp(a,name)==0 && stricmp(d,dir)==0){
                                        char fullname;
                                        f->getfullname(fullname);
                                        file *ff2=new file(fullname,f->gettype());
                                        ff2->next=0;
                                        if(f1){
                                                f1->next=ff2;
                                                f1=ff2;
                                        }else{
                                                f1=ff2;
                                                head=f1;
                                        }
                                }
                                f=f->next;
                        }
                }
        }
        releasefile(f);
}
return head;
}
file* filesearch::subfiles(char *dir){
        file *f=subff(dir);
        file *head=0;
        file *f1=0;
        while(f){
                char name,d;
                f->getfullname(name);
                f->getdir(d);
                if(stricmp(dir,d)==0 && !(f->gettype() & FILE_ATTRIBUTE_DIRECTORY)){
                        file *ff2=new file(name,f->gettype());
                        ff2->next=0;
                        if(f1){
                                f1->next=ff2;
                                f1=ff2;
                        }else{
                                f1=ff2;
                                head=f1;
                        }
                }
                f=f->next;
        }
        releasefile(f);
        return head;
}
file* filesearch::subfolders(char *dir){
        file *f=subff(dir);
        file *head=0;
        file *f1=0;
        while(f){
                char name,d;
                f->getfullname(name);
                f->getdir(d);
                if(stricmp(dir,d)==0 && (f->gettype() & FILE_ATTRIBUTE_DIRECTORY)){
                        file *ff2=new file(name,f->gettype());
                        ff2->next=0;
                        if(f1){
                                f1->next=ff2;
                                f1=ff2;
                        }else{
                                f1=ff2;
                                head=f1;
                        }
                }
                f=f->next;
        }
        releasefile(f);
        return head;
}

给个实例:

main(){
filesearch f;
file* ff=f.subfolders("d:\\test");

file* head=ff;
while(ff){
char a;
ff->getfullname(a);
cout<<a<<endl;
ff=ff->next;
}
f.releasefile(head);
}

本帖来自:http://blog.csdn.net/sx1989827/archive/2010/08/25/5837119.aspx

upring 发表于 2015-6-9 12:56:30

c语言的代码就是长 嘿嘿
页: [1]
查看完整版本: vc++编写文件搜索类