紫水晶编程技术论坛 - 努力打造成全国最好的编程论坛

 找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 4491|回复: 1

[函数] vc++编写文件搜索类

[复制链接]

1214

主题

1566

帖子

11

精华

管理员

菜鸟

Rank: 125Rank: 125Rank: 125Rank: 125Rank: 125

积分
93743

贡献奖关注奖人气王精英奖乐于助人勋章

发表于 2011-6-22 21:48:54 | 显示全部楼层 |阅读模式
一个文件搜索类,可以递归查找和模糊匹配的,花了点时间写了下,用一个链表保存文件信息。最后用releasefile释放这个链表。

  1. #include <iostream>
  2. #include "windows.h"
  3. using namespace std;
  4. class file{
  5. public:
  6.         file(char *,int);
  7.         ~file();
  8.         void getfilename(char*);
  9.         void getdir(char*);
  10.         void getfullname(char*);
  11.         void getext(char*);
  12.         void getname(char*);
  13.         int gettype();
  14.         file *next;
  15.         int getlength();
  16. private:
  17.         char *fullname;
  18.         int type;
  19. };
  20. class filesearch{
  21. public:
  22. file*        search(char *,char *,int,int);
  23. file*        subfolders(char *);
  24. file* subfiles(char *);
  25. file*  subff(char *);
  26. void   releasefile(file*);
  27. };
  28. file::file(char *path,int t){
  29.         fullname=new char[strlen(path)+1];
  30.         strcpy(fullname,path);
  31.         type=t;
  32. }
  33. file::~file(){
  34.         delete[] fullname;
  35. }
  36. void file::getfilename(char* name){
  37.         int i=strlen(fullname)-1;
  38.         while(i>=0){
  39.                 if(fullname[i]=='\\' || fullname[i]=='/'){
  40.                         strcpy(name,fullname+i+1);
  41.                         return;
  42.                 }
  43.                 i--;
  44.         }
  45.         strcpy(name,"");
  46. }
  47. void file::getdir(char* dir){
  48.         char *s=new char[strlen(fullname)+1];
  49.         getfilename(s);
  50.         int c=strlen(fullname)-strlen(s)-1;
  51.         strncpy(dir,fullname,c);
  52.         dir[c]=0;
  53.         delete[] s;
  54. }
  55. void file::getfullname(char* name){
  56.         strcpy(name,fullname);
  57. }
  58. void file::getext(char* ext){
  59.         char *s=new char[strlen(fullname)+1];
  60.         getfilename(s);
  61.         int i=strlen(s)-1;
  62.         while(i>=0){
  63.                 if(s[i]=='.'){
  64.                         strcpy(ext,s+i+1);
  65.                         return;
  66.                 }
  67.                 i--;
  68.         }
  69.         strcpy(ext,"");
  70.         delete[] s;
  71. }
  72. void file::getname(char* name){
  73.         int i=strlen(fullname)-1;
  74.         while(i>=0){
  75.                 if(fullname[i]=='\\' || fullname[i]=='/'){
  76.                         i++;
  77.                         int i1=0;
  78.                         while(fullname[i]){
  79.                        
  80.                                 if(fullname[i]=='.'){
  81.                                         name[i1]=0;
  82.                                         return;
  83.                                 }else{
  84.                                         name[i1++]=fullname[i];
  85.                                 }
  86.                                 i++;
  87.                         }
  88.                         name[i1]=0;
  89.                         return;
  90.                        
  91.                 }
  92.                 i--;
  93.         }
  94.         strcpy(name,"");
  95. }
  96. int file::gettype(){
  97. return type;
  98. }
  99. int file::getlength(){
  100.         return strlen(fullname);
  101. }
  102. file* filesearch::subff(char *path){
  103.         WIN32_FIND_DATA data;
  104.         char tpath[MAX_PATH];
  105.         strcpy(tpath,path);
  106.         strcat(tpath,"\\*");
  107.         HANDLE h=FindFirstFile(tpath,&data);
  108.         FindNextFile(h,&data);
  109.                 file *ff=0;
  110.                 file *head=0;
  111.                 while(FindNextFile(h,&data)){
  112.                         char name[MAX_PATH];
  113.                         strcpy(name,path);
  114.                         strcat(name,"\");
  115.                         strcat(name,data.cFileName);
  116.                         file* ff1=new file(name,data.dwFileAttributes);
  117.                         ff1->next=0;
  118.                         if(ff!=0){
  119.                                 ff->next=ff1;
  120.                                 ff=ff1;
  121.                         }else{
  122.                                 ff=ff1;
  123.                                 head=ff;
  124.                         }
  125.                        
  126.                         if(data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY){
  127.                                 file* ff2=subff(name);
  128.                                 if(ff2){
  129.                                 ff1->next=ff2;
  130.                                 while(ff2->next!=0){
  131.                                         ff2=ff2->next;
  132.                                 }
  133.                                 ff=ff2;
  134.                                 }
  135.                         }
  136.                        
  137.                 }
  138.                 FindClose(h);
  139.                 return head;
  140. }
  141. void filesearch::releasefile(file* f){
  142.         while(f){
  143.                 file *f1=f;
  144.                 f=f->next;
  145.                 delete f1;
  146.         }
  147. }
  148. file *filesearch::search(char *dir,char *name,int r,int reg){
  149. file *f=subff(dir);
  150. file *f1=0;
  151. file *head=0;
  152. if(f){
  153.        
  154.         if(r){
  155.                 if(reg){
  156.                         while(f){
  157.                                 char a[MAX_PATH];
  158.                                 f->getfilename(a);
  159.                                 if(strstr(a,name)){
  160.                                         char fullname[MAX_PATH];
  161.                                         f->getfullname(fullname);
  162.                                         file *ff2=new file(fullname,f->gettype());
  163.                                         ff2->next=0;
  164.                                         if(f1){
  165.                                                 f1->next=ff2;
  166.                                                 f1=ff2;
  167.                                         }else{
  168.                                                 f1=ff2;
  169.                                                 head=f1;
  170.                                         }
  171.                                 }
  172.                                 f=f->next;
  173.                         }
  174.                 }else{
  175.                         while(f){
  176.                                 char a[MAX_PATH];
  177.                                 f->getfilename(a);
  178.                                 if(stricmp(a,name)==0){
  179.                                         char fullname[MAX_PATH];
  180.                                         f->getfullname(fullname);
  181.                                         file *ff2=new file(fullname,f->gettype());
  182.                                         ff2->next=0;
  183.                                         if(f1){
  184.                                                 f1->next=ff2;
  185.                                                 f1=ff2;
  186.                                         }else{
  187.                                                 f1=ff2;
  188.                                                 head=f1;
  189.                                         }
  190.                                 }
  191.                                 f=f->next;
  192.                         }
  193.                 }
  194.         }else{
  195.                 if(reg){
  196.                         while(f){
  197.                                 char a[MAX_PATH],d[MAX_PATH];
  198.                                 f->getfilename(a);
  199.                                 f->getdir(d);
  200.                                 if(strstr(a,name) && stricmp(d,dir)==0){
  201.                                         char fullname[MAX_PATH];
  202.                                         f->getfullname(fullname);
  203.                                         file *ff2=new file(fullname,f->gettype());
  204.                                         ff2->next=0;
  205.                                         if(f1){
  206.                                                 f1->next=ff2;
  207.                                                 f1=ff2;
  208.                                         }else{
  209.                                                 f1=ff2;
  210.                                                 head=f1;
  211.                                         }
  212.                                 }
  213.                                 f=f->next;
  214.                         }
  215.                 }else{
  216.                         while(f){
  217.                                 char a[MAX_PATH],d[MAX_PATH];
  218.                                 f->getfilename(a);
  219.                                 f->getdir(d);
  220.                                 if(stricmp(a,name)==0 && stricmp(d,dir)==0){
  221.                                         char fullname[MAX_PATH];
  222.                                         f->getfullname(fullname);
  223.                                         file *ff2=new file(fullname,f->gettype());
  224.                                         ff2->next=0;
  225.                                         if(f1){
  226.                                                 f1->next=ff2;
  227.                                                 f1=ff2;
  228.                                         }else{
  229.                                                 f1=ff2;
  230.                                                 head=f1;
  231.                                         }
  232.                                 }
  233.                                 f=f->next;
  234.                         }
  235.                 }
  236.         }
  237.         releasefile(f);
  238. }
  239. return head;
  240. }
  241. file* filesearch::subfiles(char *dir){
  242.         file *f=subff(dir);
  243.         file *head=0;
  244.         file *f1=0;
  245.         while(f){
  246.                 char name[MAX_PATH],d[MAX_PATH];
  247.                 f->getfullname(name);
  248.                 f->getdir(d);
  249.                 if(stricmp(dir,d)==0 && !(f->gettype() & FILE_ATTRIBUTE_DIRECTORY)){
  250.                         file *ff2=new file(name,f->gettype());
  251.                         ff2->next=0;
  252.                         if(f1){
  253.                                 f1->next=ff2;
  254.                                 f1=ff2;
  255.                         }else{
  256.                                 f1=ff2;
  257.                                 head=f1;
  258.                         }
  259.                 }
  260.                 f=f->next;
  261.         }
  262.         releasefile(f);
  263.         return head;
  264. }
  265. file* filesearch::subfolders(char *dir){
  266.         file *f=subff(dir);
  267.         file *head=0;
  268.         file *f1=0;
  269.         while(f){
  270.                 char name[MAX_PATH],d[MAX_PATH];
  271.                 f->getfullname(name);
  272.                 f->getdir(d);
  273.                 if(stricmp(dir,d)==0 && (f->gettype() & FILE_ATTRIBUTE_DIRECTORY)){
  274.                         file *ff2=new file(name,f->gettype());
  275.                         ff2->next=0;
  276.                         if(f1){
  277.                                 f1->next=ff2;
  278.                                 f1=ff2;
  279.                         }else{
  280.                                 f1=ff2;
  281.                                 head=f1;
  282.                         }
  283.                 }
  284.                 f=f->next;
  285.         }
  286.         releasefile(f);
  287.         return head;
  288. }

复制代码
给个实例:

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

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

本帖来自:http://blog.csdn.net/sx1989827/archive/2010/08/25/5837119.aspx
【VB】QQ群:1422505加的请打上VB好友
【易语言】QQ群:9531809  或 177048
【FOXPRO】QQ群:6580324  或 33659603
【C/C++/VC】QQ群:3777552
【NiceBasic】QQ群:3703755

30

主题

723

帖子

0

精华

钻石会员

Rank: 6Rank: 6

积分
2815
发表于 2015-6-9 12:56:30 | 显示全部楼层
c语言的代码就是长 嘿嘿
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

手机版|Archiver|紫水晶工作室 ( 粤ICP备05020336号 )

GMT+8, 2024-4-29 19:05 , Processed in 0.023954 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表