#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();
}*/