C++ 递归调用遍历目录树 Windows API【转】
原文:http://www.cnblogs.com/lailx/archive/2011/11/20/2256380.html
#include <windows.h> #include <stdio.h> /* 预处理申明 */ //#pragma comment (lib, "User32.lib") /* 函数申明 */ DWORD ListAllFileInDrectory(LPSTR szPath); /* 全局变量 */ //记录所有的文件和目录数 DWORD dwTotalFileNum = 0; /* ************************************ * DWORD ListAllFileInDrectory(LPSTR szPath) * 功能 遍历目录及所有子目录,打印路径 * * 参数 LPTSTR szPath,为需遍历的目录 * * 返回值 0代表执行完成,1代码发生错误 **************************************/ DWORD ListAllFileInDrectory(LPSTR szPath) { CHAR szFilePath[MAX_PATH]; WIN32_FIND_DATA FindFileData; HANDLE hListFile; CHAR szFullPath[MAX_PATH]; //构造代表子目录和文件夹路径的字符串,使用通配符“*” lstrcpy(szFilePath, szPath); lstrcat(szFilePath, "\\*"); //查找第一个文件/目录,获得查找句柄 hListFile = FindFirstFile(szFilePath,&FindFileData); if(hListFile==INVALID_HANDLE_VALUE) { printf("错误:%d",GetLastError()); return 1; } else { do { // 过滤“.”和“..”,不需要遍历 if(lstrcmp(FindFileData.cFileName,TEXT("."))==0|| lstrcmp(FindFileData.cFileName,TEXT(".."))==0) { continue; } //构造成全路径 wsprintf(szFullPath,"%s\\%s", szPath,FindFileData.cFileName); dwTotalFileNum++; //打印 printf("\n%d\t%s\t",dwTotalFileNum,szFullPath); //如果是目录,则递归调用,列举下级目录 if(FindFileData.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY) { printf("<DIR>"); ListAllFileInDrectory(szFullPath); } } while(FindNextFile(hListFile, &FindFileData)); } return 0; } /* ************************************ * int main(int argc, PCHAR argv[]) * 功能 调用ListAllFileInDrectory * 遍历目录下的文件和子目录 * * 参数 argv[1]为需遍历的路径,如果为空则获取 * 当前路径 * * **************************************/ int main(int argc, PCHAR argv[]) { if(argc == 2) { ListAllFileInDrectory(argv[1]); } else { CHAR szCurrentPath[MAX_PATH]; GetCurrentDirectory(MAX_PATH,szCurrentPath); ListAllFileInDrectory(szCurrentPath); } printf("%d",MAX_PATH); return 0; }