#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();
}*/
本文介绍了一种使用C++实现的文件夹内所有文件及子文件夹内容的枚举方法。通过递归调用的方式,该程序能遍历指定文件夹及其子文件夹中的所有文件,并将文件名输出到控制台。

1829

被折叠的 条评论
为什么被折叠?



