String Which(const String& ExecutableName) { StringVector PATH( GetSystemPATH() ); for( StringVector::const_iterator Iter = PATH.begin() ; Iter!=PATH.end() ; ++Iter ) { StringVector Entries( GetDirContents(*Iter) ); if( std::find(Entries.begin(),Entries.end(),ExecutableName) != Entries.end() ) { return (*Iter) + GetDirectorySeparator(); } } return String(); }
String ResourceManager::Which(String ExecutableName) { StringVector PATH(ResourceManager::GetSystemPATH()); for(StringVector::const_iterator Iter = PATH.begin(); Iter!=PATH.end(); Iter++) { StringSet Entries(GetDirContents(*Iter)); if(Entries.find(ExecutableName)!=Entries.end()) { return *Iter + GetDirectorySeparator(); } } return String(); }
void FindAllAdornedVariants(const std::wstring& aSearchNameWild, const std::wstring& aSearchPath, std::list<std::wstring>& aAdornedFileNamesFound, const DrivesMap& aDriveMap) { DrivesMap::const_iterator it = aDriveMap.begin(); DrivesMap::const_iterator end = aDriveMap.end(); for ( ; it != end ; ++it) { // drive to search on int disk = tolower(it->first); std::wstring drive = L"$:"; drive[0] = disk; std::wstring searchPath(aSearchPath); // actual readable directory std::wstring localDir = it->second->iDir; // using ROM/ROFS logs for the z drive, searching for adorned variants is handled later. if (disk == 'z' && localDir.empty()) continue; // convert to the local path and see if the file exists on the drive ConvertToLocalPath( searchPath, localDir ); // search this directory std::list<std::wstring> dirContents; GetDirContents(searchPath, dirContents); std::list<std::wstring>::iterator curr = dirContents.begin(); std::list<std::wstring>::iterator end = dirContents.end(); while (curr != end) { std::wstring dirFile(*curr); if (StringUtils::WildcardCompare(aSearchNameWild,dirFile)) { // found an adorned file, add to the list of adorned names found std::wstringstream foundFile; foundFile << drive << aSearchPath << dirFile; aAdornedFileNamesFound.push_back(foundFile.str()); } ++curr; } } }
/********************************************************************** * 函数名称: GetFilesIndir * 功能描述: 以深度优先的方式获得目录下的文件 * 即: 先获得顶层目录下的文件, 再进入一级子目录A * 再获得一级子目录A下的文件, 再进入二级子目录AA, ... * 处理完一级子目录A后, 再进入一级子目录B * * "连播模式"下调用该函数获得要显示的文件 * 有两种方法获得这些文件: * 1. 事先把所有文件的名字保存到某个缓冲区中 * 2. 用到时再去搜索取出若干个文件名 * *第1种方法比较简单,但是当文件很多时有可能导致内存不足. * 我们使用第2种方法: * 假设某目录(包括所有子目录)下所有的文件都给它编一个号 * * 输入参数:strDirName : 要获得哪个目录下的内容 * piStartNumberToRecord : 从第几个文件开始取出它们的名字 * piCurFileNumber : 当前搜索到的文件编号 * iFileCountTotal : 总共要取出多少个文件的名字 piFileCountHaveGet : 已经得到了多少个文件的名字 * apstrFileNames[][256] : 用来存储搜索到的文件名 * 输出/输出参数: * 返 回 值:0 - 成功 * 1 - 失败 * 修改日期 版本号 修改人 修改内容 * ----------------------------------------------- * 2013/02/08 V1.0 韦东山 创建 ***********************************************************************/ int GetFilesIndir(char *strDirName, int *piStartNumberToRecord, int *piCurFileNumber, int *piFileCountHaveGet, int iFileCountTotal, char apstrFileNames[][256]) { int iError; PT_DirContent *aptDirContents; /* 数组:存有目录下"顶层子目录","文件"的名字 */ int iDirContentsNumber; /* aptDirContents数组有多少项 */ int i; char strSubDirName[256]; /* 为避免访问的目录互相嵌套, 设置能访问的目录深度为10 */ #define MAX_DIR_DEEPNESS 10 static int iDirDeepness = 0; /*如果嵌套深度大于10,退出*/ if (iDirDeepness > MAX_DIR_DEEPNESS) { return -1; } iDirDeepness++; /* 把某目录下所含的顶层子目录、顶层文件都记录下来,并且按名字排序*/ iError = GetDirContents(strDirName, &aptDirContents, &iDirContentsNumber); if (iError) { DBG_PRINTF("GetDirContents error!\n"); iDirDeepness--; return -1; } /* 先记录文件 */ for (i = 0; i < iDirContentsNumber; i++) { if (aptDirContents[i]->eFileType == FILETYPE_FILE) { if (*piCurFileNumber >= *piStartNumberToRecord) { snprintf(apstrFileNames[*piFileCountHaveGet], 256, "%s/%s", strDirName, aptDirContents[i]->strName); (*piFileCountHaveGet)++; (*piCurFileNumber)++; (*piStartNumberToRecord)++; /*已经得到了多少个文件的名字 大于 总共要取出多少个文件的名字*/ if (*piFileCountHaveGet >= iFileCountTotal) { FreeDirContents(aptDirContents, iDirContentsNumber); iDirDeepness--; return 0; } } else { (*piCurFileNumber)++;/*当前搜索到的文件编号*/ } } } /* 递归处理目录 */ for (i = 0; i < iDirContentsNumber; i++) { if ((aptDirContents[i]->eFileType == FILETYPE_DIR) && isRegDir(strDirName, aptDirContents[i]->strName)) { snprintf(strSubDirName, 256, "%s/%s", strDirName, aptDirContents[i]->strName); /*嵌套调用本函数*/ GetFilesIndir(strSubDirName, piStartNumberToRecord, piCurFileNumber, piFileCountHaveGet, iFileCountTotal, apstrFileNames); if (*piFileCountHaveGet >= iFileCountTotal) { FreeDirContents(aptDirContents, iDirContentsNumber); iDirDeepness--; return 0; } } } FreeDirContents(aptDirContents, iDirContentsNumber); iDirDeepness--; return 0; }