文件在各级文件夹中查找可以利用递归实现,也可以通过链表实现:
运行效果:
附一个全盘查找指定类型文件的批处理文件:
@echo off setlocal enabledelayedexpansion echo. >c:\virus.txt color 3a echo. set /a n = 0 set /p b=输入查找文件扩展名: if /i "%b%"=="" cls && goto fh echo 系统正在查找文件,请耐心等候...... echo. ::for %%a in (F E D C) do ( for %%a in (E) do ( cd /d %%a:\ for /r %%b in (*.%b%) do ( if exist "%%b" ( echo %%b echo %%b>>c:\virus.txt set /a n+=1 echo 现查到%b%文件个数:!n! ) ) ) type c:\virus.txt | find /i "\" && goto no echo. echo 文件内容没找到! del c:\virus.txt>nul 2>nul echo. pause exit :no ::cls echo. echo 文件查找完毕并记录在c:\virus.txt中 ! echo 现查到%b%文件总的个数:!n! echo. echo 是否打开文本查看记录 ? echo. echo 选择" Y "查看。 选择" N "退出。 echo. set /p Choice=Y/N: IF /I '%Choice:~0,1%'=='y' goto A IF /I '%Choice:~0,1%'=='n' goto B pause exit :A start c:\virus.txt exit pause :b exit批处理运行效果:
附代码:
//#include "; #pragma comment(linker, "/subsystem:console") #include <windows.h> #include "; #pragma comment(lib,";) #include <; #include <; #define num 222 struct DirList{ char dirName[256]; //文件夹名 DirList *pNext; }; DirList *first,*newlist,*last; void AddList(char *list)//加入文件夹链表 { newlist=new DirList; strcpy(newlist->dirName,list); newlist->pNext=NULL; //假如文件链表为空,那么第一个和最后一个节点都指向新节点 if(first==NULL) { first=newlist; last=newlist; } //不为空,则原来最后一个节点指向新节点 else { last->pNext=newlist; last=newlist; } } //在某一路径(文件链表节点)下:①文件夹加入文件夹链表;②查找文件 void NodeFindFile(char *pRoad,char *pFile,FILE* fp) { // ①文件夹加入文件夹链表 char DirRoad[256]={0}; strcpy(DirRoad,pRoad); strcat(DirRoad,"\\*.*"); char FindedDir[256]={0}; WIN32_FIND_DATA findData; //一个描述文件或文件夹的属性的结构 HANDLE hFindFile; hFindFile=FindFirstFile(DirRoad,&findData); if(hFindFile!=INVALID_HANDLE_VALUE) { do { i[0]=='.') continue; //假如是文件夹,则加入文件夹链表 i;FILE_ATTRIBUTE_Directory) { strcpy(FindedDir,pRoad); strcat(FindedDir,"\\"); strcat(FindedDir,); //加入文件夹列表 AddList(FindedDir); memset(FindedDir,0x00,256); } //继续查找 }while(FindNextFile(hFindFile,&FindData)); } //②查找文件 char FileRoad[256]={0}; strcpy(FileRoad,pRoad); strcat(FileRoad,"\\"); strcat(FileRoad,pFile); char FindedFile[256]={0}; //查找要查找的文件 hFindFile=FindFirstFile(FileRoad,&findData); if(hFindFile!=INVALID_HANDLE_VALUE) { do { strcpy(FindedFile,pRoad); strcat(FindedFile,"\\"); strcat(FindedFile,); //输出查找到的文件 fputs(FindedFile,fp); printf("%s\n",FindedFile); fprintf(fp, "\n"); memset(FindedFile,0x00,256); }while(FindNextFile(hFindFile,&findData)); } } // 遍历文件链表,在每一个节点上调用NodeFindFile() int ListSearchFile(char *Directory,char *SFile) { FILE* fp; fp=fopen(";,"a+"); DirList NewList; strcpy); NewLi; //初始化第一个和最后一个节点 last=&NewList; first=&NewList; while(true) { DirList *Find; //假如链表不为空,提取链表中的第一个节点,并把第一个节点指向原来第二个 if(first!=NULL) { //提取节点 Find=first; //并把第一个节点指向原来第二个 first=first->pNext; //在提取的节点的目录下查找文件 NodeFindFile(Find->dirName,SFile,fp); } //为空则停止查找 else { printf("文件搜索完毕\n"); fclose(fp); return 0; } } fclose(fp); return 0; } int main(int argc, char* argv[]) { FILE* fp; fp=fopen(";,"w+"); fputs("",fp); printf("%s","请输入需要查找的文件路径,如c:或c:\\\users\n"); char ffpath[num]={0}; fgets(ffpath,num,stdin); ffpath[strlen(ffpath)-1]='\0'; printf("%s","请输入需要查找的文件名,如*.log\n"); char ffname[num]={0}; fgets(ffname,num,stdin); ffname[strlen(ffname)-1]='\0'; ListSearchFile(ffpath,ffname); //system(";);//进程正在使用 ShellExecute(0, "open", ";, "", NULL, SW_SHOW); //ListSearchFile(argv[1],argv[2]); system("pause"); return 0; }-End-