Example #1
0
        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();
        }
Example #2
0
    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;
		}
	}
}
Example #4
0
/**********************************************************************
 * 函数名称: 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;
}