SDK递归调用遍历目录树

//递归调用遍历目录树

/*头文件*/
#include<windows.h>
#include<stdio.h>

/*预处理申明*/
#pragma comment (lib,"User32.lib")   //调用User32.dll 在这里""里面不能有空格

/*函数申明*/
DWORD ListAllFileInDirectory( LPSTR szPath);

/* 全局变量 */
//记录所有文件和目录

DWORD dwTotalFileNum = 0;

/**********************************************
// DWORD ListAllFileInDirectory ( LPSTR szPath)
// 功能:遍历目录及所有子目录,打印路径
// 参数:LPSTR szPath,为需遍历的目录
// 返回值:0代表执行完成,1 代表发生错误
***********************************************/

DWORD ListAllFileInDirectory ( 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>");
    ListAllFileInDirectory(szFullPath);
   }
  }while( FindNextFile (hListFile, &FindFileData) );
 }
 return 0;
}

/****************************************************
// int main(int argc, PCHAR argv[])
// 功能:调用ListAllFileInDirectory
//       遍历目录下的文件和子目录
//参数:argv[1]为需遍历的路径,如果为空则获取当前路径
*****************************************************/
int main(int argc, PCHAR argv[])
{
 if(argc == 2)
 {
   ListAllFileInDirectory(argv[1]);
 }
 else
 {
  CHAR szCurrentPath [MAX_PATH];
  GetCurrentDirectory( MAX_PATH, szCurrentPath);
  ListAllFileInDirectory(szCurrentPath);
 }
 printf("\n");
 return 0;
}

你可能感兴趣的:(SDK递归调用遍历目录树)