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

#include <ShlObj.h>
#include <cassert>
#include <iostream>
#define FILESIZE 1024
using namespace std;
typedef char CHAR_64[64];
 
BOOL ChooseFolder(char szFolder[MAX_PATH]);
int EnumAllFilesInFolder( char const  szFolder[MAX_PATH],CHAR_64 *szFileNames,
                   int &iIndex, int nSize=FILESIZE);
int EnumOnlyFilesInFolder( char const  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( char const 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';
   }
  
   else if (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';
           
         }
         else if (strcmp(fd.cFileName,"..")&&strcmp(fd.cFileName,"."))
         {
            strcpy(szFileNames[iIndex],fd.cFileName);
            ++iIndex;
         }
      }
     
   }
   return iIndex;
}
 
int EnumOnlyFilesInFolder( char const 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 ;
        
         else if (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();
}*/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值