A un détail près : en fait, ce code ne va pas chercher sur toutes les cartes mémoire mais seulement sur la première où le répertoire "Métro" existe. Mais ça peut s'adapter, évidemment...
La fonction de listage remplit (avec AddDBRecord) une liste créée en mémoire. Les bases trouvées sont stockées dans une structure dbRecord où je conserve le nom et la version (grosso modo). A vous d'adapter pour votre usage.
CODE
#define APP_DB_FOLDER "/PALM/Programs/metro"
#define APP_CREATOR_ID 'MTro'
static UInt16 VFSvolRefNum = vfsInvalidVolRef;
char sBuf[160]; // General use buffers
char sBuf2[160];
// ---------------------------------------------------
// Find the right VFS volume number and store it
// vfsInvalidVolRef if none available (no VFS/no card)
// Find the first volume available
// Better if we find one where the Metro path exists
// Return true if found the path
// ---------------------------------------------------
static Boolean FindVFSVolume(void)
{
UInt32 info;
UInt16 volRefNum;
UInt32 volIterator = vfsIteratorStart;
FileRef dirRef;
// Default = no VFS volume available
VFSvolRefNum = vfsInvalidVolRef;
// Try the /PALM/Programs/metro directory on expansion cards
// Check VFS feature first
if (FtrGet(sysFileCVFSMgr, vfsFtrIDVersion, &info) == errNone)
{
// Loop on all expansion cards
while (volIterator != vfsIteratorStop)
{
// Check for the metro directory
if (VFSVolumeEnumerate(&volRefNum, &volIterator) == errNone)
{
// Save first volume available
if (VFSvolRefNum == vfsInvalidVolRef)
{
VFSvolRefNum = volRefNum;
}
// Better still: a volume with our path exists
if (VFSFileOpen(volRefNum, APP_DB_FOLDER, vfsModeRead, &dirRef) == errNone)
{
VFSvolRefNum = volRefNum;
VFSFileClose(dirRef);
// Stop loop on first match
return true;
}
}
}
}
return false;
}
// ---------------------------------------------------
// Build path name
// ---------------------------------------------------
static void MakePathName(Char * pathName, Char * fileName)
{
StrCopy(pathName, APP_DB_FOLDER);
StrCat(pathName, "/");
StrCat(pathName, fileName);
}
// ----------------------------
// Databases list fill function
// ----------------------------
static void FillDBList(FormPtr form, ListPtr list)
{
DBRECORD dbRecord;
// Database exploration (in VFS card)
FileRef dirRef;
UInt32 fileIterator;
FileInfoType fileInfo;
FileRef dbfile;
// Try the /PALM/Programs/metro directory on expansion cards
if (FindVFSVolume())
{
// Open the metro directory
if (VFSFileOpen(VFSvolRefNum, APP_DB_FOLDER, vfsModeRead, &dirRef) == errNone)
{
fileIterator = expIteratorStart;
fileInfo.nameBufLen = 64;
fileInfo.nameP = sBuf;
// Iterate over the files in the directory
while (fileIterator != expIteratorStop)
{
// Get next file
if(VFSDirEntryEnumerate(dirRef, &fileIterator, &fileInfo) == errNone)
{
// Make an entry for the list
StrCopy(dbRecord.dbName, fileInfo.nameP);
dbRecord.dbType = APP_EXPANSION_ID;
dbRecord.dbOld = 0;
// Open database to get its name and version
MakePathName(sBuf2, fileInfo.nameP);
// Open file
if (VFSFileOpen(VFSvolRefNum, sBuf2, vfsModeRead, &dbfile) == errNone)
{
type = 0;
// Read a good part of the header
if (VFSFileRead(dbfile, 0xA8, sBuf2, NULL) == errNone)
{
// Store base name
StrNCopy(dbRecord.dbCity, sBuf2, 32);
dbRecord.dbCity[32] = 0;
// Get version
MemMove(&vers, sBuf2 + 0x22, 2);
// Check version
if (vers < APP_CUR_VER || vers >= APP_MAX_VER)
{
// Remember it's old
dbRecord.dbOld = 1;
}
// Get creator ID
MemMove(&type, sBuf2 + 0x40, 4);
}
// Close file
VFSFileClose(dbfile);
// Check DB creator
if (type != APP_CREATOR_ID)
{
continue;
}
}
else break;
// Add record to list
AddDBRecord(&size, &count, &dbRecord);
}
}
// Close file
VFSFileClose(dirRef);
}
}
}
Enjoy