选择文件夹并遍历里面的文件

本文介绍了一种使用C++实现的文件夹内所有文件及子文件夹内容的枚举方法。通过递归调用的方式,该程序能遍历指定文件夹及其子文件夹中的所有文件,并将文件名输出到控制台。
#include <ShlObj.h>
#include <cassert>
#include <iostream>
#define FILESIZE 1024
usingnamespace std;
typedefchar CHAR_64[64];
 
BOOL ChooseFolder(char szFolder[MAX_PATH]);
int EnumAllFilesInFolder(charconst szFolder[MAX_PATH],CHAR_64 *szFileNames,
                   int &iIndex,int nSize=FILESIZE);
int EnumOnlyFilesInFolder(charconst szFolder[MAX_PATH],CHAR_64 *szFileNames,
                    int &iIndex,int nSize=FILESIZE);
int main()
{     
   char szFolder[MAX_PATH];
   char szFileNames[FILESIZE][64];
   int iIndex=0;
  
   if (ChooseFolder(szFolder))
   {
      cout<<szFolder<<endl;
      EnumAllFilesInFolder(szFolder,szFileNames,iIndex,FILESIZE)
      for (int i=0;i<iIndex;++i)
         cout<<szFileNames[i]<<endl;
   }
}
 
BOOL ChooseFolder(char szFolder[MAX_PATH])
{
   BROWSEINFO bi;
   ZeroMemory(&bi,sizeof(bi));
   bi.hwndOwner=NULL;
   bi.lpszTitle="选择文件夹";
   bi.ulFlags=BIF_RETURNONLYFSDIRS;
   LPITEMIDLIST pidl = SHBrowseForFolder(&bi);
   return SHGetPathFromIDList(pidl, szFolder);
}
int EnumAllFilesInFolder(charconst szFolder[MAX_PATH],CHAR_64 *szFileNames,
                   int &iIndex,int nSize)
{  
   BOOL bFind=TRUE;
   size_t iLen=strlen(szFolder);
 
   char szTempFolder[MAX_PATH];
   strcpy(szTempFolder,szFolder);
   if (szTempFolder[iLen-1]!='//')
   {
      strcat(szTempFolder,"//");
      ++iLen;
   }
   strcat(szTempFolder,"*");
 
   WIN32_FIND_DATA fd;
   ZeroMemory(&fd,sizeof(fd));
   HANDLE hFind=FindFirstFile(szTempFolder,&fd);
   assert(hFind);
 
   if( (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
      && strcmp(fd.cFileName, ".") && strcmp(fd.cFileName, "..") )
   {
      szTempFolder[iLen]='/0';
      strcat(szTempFolder,fd.cFileName);
      EnumAllFilesInFolder(szTempFolder,szFileNames,iIndex);
      szTempFolder[iLen]='*';
      szTempFolder[iLen+1]='/0';
   }
  
   elseif (strcmp(fd.cFileName, ".") && strcmp(fd.cFileName, "..") )
   {
      if (iIndex<nSize)
      {       
         strcpy(szFileNames[iIndex],fd.cFileName);
         ++iIndex;
      }
   }
   while (iIndex<nSize&&bFind)
   { 
      if ((bFind=FindNextFile(hFind,&fd)))
      {
         if ((fd.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)
            &&strcmp(fd.cFileName,".")&&strcmp(fd.cFileName,".."))
         {              
            szTempFolder[iLen]='/0';
            strcat(szTempFolder,fd.cFileName);            
            EnumAllFilesInFolder(szTempFolder,szFileNames,iIndex);
            szTempFolder[iLen]='*';
            szTempFolder[iLen+1]='/0';
           
         }
         elseif(strcmp(fd.cFileName,"..")&&strcmp(fd.cFileName,"."))
         {
            strcpy(szFileNames[iIndex],fd.cFileName);
            ++iIndex;
         }
      }
     
   }
   return iIndex;
}
 
int EnumOnlyFilesInFolder(charconst szFolder[MAX_PATH],CHAR_64 *szFileNames,
                    int &iIndex,int nSize)
{  
   BOOL bFind=TRUE;
   size_t iLen=strlen(szFolder);
 
   char szTempFolder[MAX_PATH];
   strcpy(szTempFolder,szFolder);
   if (szTempFolder[iLen-1]!='//')
   {
      strcat(szTempFolder,"//");
      ++iLen;
   }
   strcat(szTempFolder,"*");
 
   WIN32_FIND_DATA fd;
   ZeroMemory(&fd,sizeof(fd));
   HANDLE hFind=FindFirstFile(szTempFolder,&fd);
   assert(hFind);
  
   while (iIndex<nSize&&bFind)
   { 
      if ((bFind=FindNextFile(hFind,&fd)))
      {
         if ((fd.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)
            &&strcmp(fd.cFileName,".")&&strcmp(fd.cFileName,".."))
            continue;
        
         elseif(strcmp(fd.cFileName,"..")&&strcmp(fd.cFileName,"."))
         {
            strcpy(szFileNames[iIndex],fd.cFileName);
            ++iIndex;
         }
      }
 
   }
   return iIndex;
}
 
/*void Foo()
{
    CFileFind finder;
    BOOL bWorking = finder.FindFile((LPCTSTR)strTarget);
    while (bWorking)
    {
       bWorking = finder.FindNextFile();        
       if ( !finder.IsDots() && finder.IsDirectory() )
       {
           CString strFileName = finder.GetFileName();
           CString strNewFilterPath = strFilterPath + "//" + strFileName;
 
           if ( strFileName.CompareNoCase(strFilterName) == 0 )
              DelSubDir( bClearAll,strNewFilterPath );
           else
              DelDir( bRecursion,bClearAll,strFilterName,strNewFilterPath);
       }
    }
    finder.Close();
}*/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值