/*! @function ******************************************************************************** <PRE> 函数名 : GetAllSubDirs 功能 : 获得所有符合条件的子目录列表 参数 : [OUT] vResult : 用来储存结果 [IN] dirPattern : 要查找的子目录通配符 [IN] includeSubdir : 是否包含子目录 [IN] includeHidden : 是否包含隐含目录 [IN] includeDot : 是否包含“.”和“..”系统目录 返回值 : 符合条件的子目录数量 抛出异常 : - -------------------------------------------------------------------------------- 备注 : 无论是否成功,vResult中的原内容都将被清空 典型用法 : - -------------------------------------------------------------------------------- 作者 : 白杨 </PRE> *******************************************************************************/ ULONG CDir::GetAllSubDirs(OUT VSTR& vResult, IN tstringEx dirPattern /*= byT("*")*/, IN bool includeSubdir /*= false*/, IN bool includeHidden /*= true*/, IN bool includeDot /*= false*/) const { // ========================================================================= // = 初始化 vResult.clear(); if (dirPattern.empty() || !IsValid()) { return 0; }
WIN32_FIND_DATA FindFileData; HANDLE hFind; tstringEx Pattern = m_basedir + DELIMITER + dirPattern;
// ========================================================================= // = 匹配子目录 hFind = ::FindFirstFile(Pattern.c_str(), &FindFileData); if(INVALID_HANDLE_VALUE == hFind) return 0; } tstringEx stDir; if (-1 != (n=dirPattern.find_last_of(ALLDELIMITERS))) { stDir = m_basedir + DELIMITER + dirPattern.substr(0, n) + DELIMITER; } else { stDir = m_basedir + DELIMITER; }
do { if (!(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) { goto findnext; }
if (IsDotDir(FindFileData.cFileName) && !includeDot) { goto findnext; }
if ((FindFileData.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN) && !includeHidden) { goto findnext; }
// 递归搜索子目录 if (includeSubdir && !IsDotDir(FindFileData.cFileName)) { VSTR rr; tstringEx rdir; if (-1 != n) { rdir = dirPattern.substr(0, n)+DELIMITER+FindFileData.cFileName +DELIMITER+dirPattern.substr(n+1, -1); } else { rdir = FindFileData.cFileName+DELIMITER+dirPattern; }
GetAllSubDirs(rr, rdir, includeSubdir, includeHidden, includeDot); const ULONG count = rr.size(); for (ULONG i=0; i<count; ++i) { vResult.push_back(rr[i]); } } // if (includeSubdir && !IsDotDir(FindFileData.cFileName))
vResult.push_back(stDir + FindFileData.cFileName);
findnext: if (!::FindNextFile(hFind, &FindFileData)) { break; } } while(true);
::FindClose(hFind); return vResult.size(); } |