IResourceSet * IResourceSet::CreateResourceSetFromFile(LPCTSTR lpszFile) 
{
	CPackResourceSet * pResource = new CPackResourceSet();
	pResource->Open(lpszFile);
	return pResource;
}
bool CResourceFileSystem::Open( LPCTSTR lpszPackFolder )
{
    tstring folderPath = lpszPackFolder;
    tstring::iterator lastChar = folderPath.end();
    --lastChar;
    if ( *lastChar != TEXT('/') && *lastChar != TEXT('\\') )
    {
        folderPath += TEXT("\\");
    }

    tstring condition = folderPath + TEXT("*.pack");

    WIN32_FIND_DATA ffd;
    HANDLE hFind;

    typedef map<tstring, shared_ptr<IResource> > ResourceMap;
    ResourceMap resourceMap;

    hFind = ::FindFirstFile(condition.c_str(), &ffd);
    if (hFind != INVALID_HANDLE_VALUE)
    {
        do
        {
            // 非文件夹
            if ( (ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == 0)
            {
                tstring fullPath = folderPath + ffd.cFileName;
                CPackResourceSet resourceSet;
                if (resourceSet.Open(fullPath.c_str()))
                {
                    for (vector<shared_ptr<IResource>>::iterator iter = resourceSet.m_Resources.begin(); iter != resourceSet.m_Resources.end(); ++iter)
                    {
                        // 和本地比较版本,保留高版本的
                        ResourceMap::iterator iter2 = resourceMap.find((*iter)->GetName());

                        if (iter2 != resourceMap.end())
                        {
                            shared_ptr<IResource> spResourceOld = iter2->second;
                            if (spResourceOld->GetVersion() >= (*iter)->GetVersion())
                            {
                                continue;
                            }
                        }

                        resourceMap[(*iter)->GetName()] = (*iter);
                    }
                }
            }
        }
        while (::FindNextFile(hFind, &ffd) != 0);
        ::FindClose(hFind);
    }

    if (resourceMap.size() > 0)
    {
        m_Resources.clear();
        for (ResourceMap::iterator iter = resourceMap.begin(); iter != resourceMap.end(); ++iter)
        {
            m_Resources.push_back( iter->second );
        }

        sort(m_Resources.begin(), m_Resources.end(), ResourceGreater());

        return true;
    }
    else
    {
        return false;
    }
}