声明:
//
//这里的匹配支持多项匹配,如"*.txt;*.exe"表示同时查找满足txt和exe扩展名的文件或者含有.txt或者.exe的目录
//
void EnumDirectoriesWithFilter(const CString& strFilter, const CString& strIn, CStringArray& strOuts);
void EnumFilesWithFilter(const CString& strFilter, const CString& strIn, CStringArray& strOuts);
void EnumAllDirectoriesWithFilter(const CString& strFilter, const CString& strIn, CStringArray& strOuts);
void EnumAllFilesWithFilter(const CString& strFilter, const CString& strIn, CStringArray& strOuts);
void EnumDirectories(const CString& strIn, CStringArray& strOuts);
void EnumFiles(const CString& strIn, CStringArray& strOuts);
void EnumAllDirectories(const CString& strIn, CStringArray& strOuts);
void EnumAllFiles(const CString& strIn, CStringArray& strOuts);
实现:
#include <Shlwapi.h>
void EnumDirectoriesWithFilter(const CString& strFilter, const CString& strIn, CStringArray& strOuts)
{
WIN32_FIND_DATA wfdata;
memset(&wfdata, 0, sizeof(WIN32_FIND_DATA));
//HANDLE hFind = FindFirstFile(strIn + _T("//") + strFilter, &wfdata);
HANDLE hFind = FindFirstFile(strIn + _T("//*"), &wfdata);
if(hFind != INVALID_HANDLE_VALUE) {
do {
if((wfdata.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
&& _tcscmp(wfdata.cFileName, _T("." )) && _tcscmp(wfdata.cFileName, _T(".."))){
//strOuts.Add(strIn + _T("//") + wfdata.cFileName);
CString strDir = strIn+_T("//") + wfdata.cFileName;
if (PathMatchSpec(strDir, strFilter)) {
strOuts.Add(strDir);
}
}
} while (FindNextFile(hFind, &wfdata));
FindClose(hFind);
}
}
void EnumFilesWithFilter(const CString& strFilter, const CString& strIn, CStringArray& strOuts)
{
WIN32_FIND_DATA wfdata;
memset(&wfdata, 0, sizeof(WIN32_FIND_DATA));
//HANDLE hFind = FindFirstFile(strIn + _T("//") + strFilter, &wfdata);
HANDLE hFind = FindFirstFile(strIn + _T("//*.*"), &wfdata);
if(hFind != INVALID_HANDLE_VALUE) {
do {
if(!(wfdata.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)){
//strOuts.Add(strIn + _T("//") + wfdata.cFileName);
CString strFile = strIn + _T("//") + wfdata.cFileName;
if (PathMatchSpec(strFile, strFilter)) {
strOuts.Add(strFile);
}
}
} while (FindNextFile(hFind, &wfdata));
FindClose(hFind);
}
}
void EnumAllDirectoriesWithFilter(const CString& strFilter, const CString& strIn, CStringArray& strOuts)
{
WIN32_FIND_DATA wfdata;
memset(&wfdata, 0, sizeof(WIN32_FIND_DATA));
HANDLE hFind = FindFirstFile(strIn + _T("//*"), &wfdata);
if(hFind != INVALID_HANDLE_VALUE) {
do {
if((wfdata.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
&& _tcscmp(wfdata.cFileName, _T("." )) && _tcscmp(wfdata.cFileName, _T(".."))){
CString strDir = strIn+_T("//") + wfdata.cFileName;
if (PathMatchSpec(strDir, strFilter)) {
strOuts.Add(strDir);
}
EnumAllDirectoriesWithFilter(strFilter, strDir, strOuts);
}
} while (FindNextFile(hFind, &wfdata));
FindClose(hFind);
}
}
void EnumAllFilesWithFilter(const CString& strFilter, const CString& strIn, CStringArray& strOuts)
{
WIN32_FIND_DATA wfdata;
memset(&wfdata, 0, sizeof(WIN32_FIND_DATA));
HANDLE hFind = FindFirstFile(strIn +_T("//*"), &wfdata);
if(hFind != INVALID_HANDLE_VALUE) {
do {
if(wfdata.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
if (_tcscmp(wfdata.cFileName, _T("." )) && _tcscmp(wfdata.cFileName, _T(".."))) {
EnumAllFilesWithFilter(strFilter, strIn + _T("//") + wfdata.cFileName, strOuts);
}
} else {
CString strFile = strIn + _T("//") + wfdata.cFileName;
if (PathMatchSpec(strFile, strFilter)) {
strOuts.Add(strFile);
}
}
} while (FindNextFile(hFind, &wfdata));
FindClose(hFind);
}
}
void EnumDirectories(const CString& strIn, CStringArray& strOuts)
{
EnumDirectoriesWithFilter(_T("*"), strIn, strOuts);
}
void EnumFiles(const CString& strIn, CStringArray& strOuts)
{
EnumFilesWithFilter(_T("*.*"), strIn, strOuts);
}
void EnumAllDirectories(const CString& strIn, CStringArray& strOuts)
{
EnumAllDirectoriesWithFilter(_T("*"), strIn, strOuts);
}
void EnumAllFiles(const CString& strIn, CStringArray& strOuts)
{
EnumAllFilesWithFilter(_T("*"), strIn, strOuts);
}