//VS2005、VC6下编译通过,普通的递归算法 #include<windows.h> #define MAX_FILE_COUNT 64 #define MAX_SEARCH_TIME 4096 //大概的数,由于程序算法,实际会多几次 int iSearchTime=0;//搜索文件(包括文件夹)次数计数器 void FindFiles(const PTCHAR szDirectory,const PTCHAR szFileName,PTCHAR szsResult[],int *count); int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PTCHAR szCmdLine,int iCmdShow) { int i,count;//计数变量 PTCHAR szs[MAX_FILE_COUNT];//搜索结果缓存 for(i=0;i<MAX_FILE_COUNT;i++) { szs[i]=(PTCHAR)VirtualAlloc(NULL,MAX_PATH,MEM_RESERVE|MEM_COMMIT,PAGE_EXECUTE_READWRITE); } count=0;//因处理count个,置count为0也相当于清空szs FindFiles(TEXT(".//"),TEXT("*.c"),szs,&count);//搜索当前目录及子目录下所有扩展名为.c的文件 for(i=0;i<count;i++) { MessageBox(NULL,szs[i],TEXT("标题"),0); } for(i=0;i<MAX_FILE_COUNT;i++) { VirtualFree(szs[i],0,MEM_RELEASE); } } void FindFiles(const PTCHAR szDirectory,const PTCHAR szFileName,PTCHAR szsResult[],int *count) { WIN32_FIND_DATA strctFindData; HANDLE hFind; HANDLE hDirectory; PTCHAR szFileNameTemp; szFileNameTemp=(PTCHAR)VirtualAlloc(NULL,MAX_PATH,MEM_RESERVE|MEM_COMMIT,PAGE_EXECUTE_READWRITE); lstrcpy(szFileNameTemp,szDirectory); lstrcat(szFileNameTemp,szFileName);//szFileNameTemp为当前路径下要搜索的相对全文件名 hFind=FindFirstFile(szFileNameTemp,&strctFindData); do { iSearchTime++;//包括第1次查找(FindFirstFile)的计数,及以后的 //if1 搜索次数不大于最大允许次数//处理结果之前判断iSearchTime //if2 count要小于MAX_FILE_COUNT //if3 句柄有效 if(iSearchTime<=MAX_SEARCH_TIME && (*count)<MAX_FILE_COUNT && hFind!=INVALID_HANDLE_VALUE) { if(!(strctFindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))//不是目录,即是文件,则保存搜索结果,计数器加1 { lstrcpy(szsResult[(*count)],szDirectory); //先存入当前路径 lstrcat(szsResult[(*count)],strctFindData.cFileName); //再存入文件名,即保存了相对全文件名 (*count)++; } } else { break; } }while(FindNextFile(hFind,&strctFindData)); FindClose(hFind); lstrcpy(szFileNameTemp,szDirectory); lstrcat(szFileNameTemp,TEXT("*"));//szFileNameTemp的形式为“路径/*”,准备搜索文件夹 hDirectory=FindFirstFile(szFileNameTemp,&strctFindData); do { iSearchTime++;//包括第1次查找(FindFirstFile)的计数,及以后的 //if1 搜索次数不大于最大允许次数//处理结果之前判断iSearchTime //if2 句柄有效 if(iSearchTime<=MAX_SEARCH_TIME && hDirectory!=INVALID_HANDLE_VALUE) { if((strctFindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) && lstrcmp(strctFindData.cFileName,TEXT(".")) && lstrcmp(strctFindData.cFileName,TEXT("..")))//strcmp(strctFindData.cFileName,TEXT(".")) && strcmp(strctFindData.cFileName,TEXT(".."))) //是目录,则准备搜索该目录下符合条件的文件 { lstrcpy(szFileNameTemp,szDirectory); //先存入当前路径 lstrcat(szFileNameTemp,strctFindData.cFileName);//再存入目录名 lstrcat(szFileNameTemp,TEXT("//")); //再存入/,最后szFileNameTemp的形式为“路径/” FindFiles(szFileNameTemp,szFileName,szsResult,count); } } else { break; } }while(FindNextFile(hDirectory,&strctFindData)); FindClose(hDirectory); VirtualFree(szFileNameTemp,0,MEM_RELEASE); }