are collected up at run-up time, the prog. produces a disk file CatFiles.txt which is this list.
struct structCatFile
{
CString strCatPath; //eg "d:\games\copy of x3 reunion 1.403 test mod downloads\07.cat"
CString strFilePath; //eg "dds\1156_diff.dds" EDIT this is the real location, not necessarily the same as the one in the bod/bob file
long nFileLength; //binary or unpacked, depending on usage
};
class CCatFileArray : public CArray<structCatFile, structCatFile>{};
CCatFileArray m_arrCATFileBuffers[MAXCATS]
Because I'm handling all mod cats that are present, as well as the 01-07.cat standard set,
I have to map each mod (dataset) into the list via other lists:
CStringArray m_arrCATNames;
long m_nStdCatCount; //std set has multiple cat files
long m_nModCatCount; //one cat file per mod
CString m_strDataSetPaths[MAXDATASETS];
plus
char * m_xmlBuffer[MAXDATASETS];//concatenated xml files, temp buffer
char * m_pTShipsData[MAXDATASETS];
char * m_pTCockpitsData[MAXDATASETS];
char * m_pComponentsData[MAXDATASETS];
char * m_pTFactoriesData[MAXDATASETS];
char * m_pDummiesData[MAXDATASETS];
and now
//list of directories for raw install mode
CString m_strTDir, m_strTypesDir;

it's not massively memory efficient, but not too bad & it works, plus there's a lot more as you can imagine.
Each mod is assumed to have only one cat file (apart from false mods), so if anyone makes a mod
with more than one I'll have to re-work it a bit.
If you want some code snips, I suggest going over to PM's cos it could get a bit over the top in a post.
I did notice that post about External Docking, but haven't really looked at it in detail (yet).