Fredouille.95
18/06/2006 à 07:53
Mon problème du jour !!
J'aimerais remplir une liste avec le nom des fichiers contenus dans un dossier (un peu comme dans le titre quoi!).
Je suis partis sur l'utilisation de l'API VFSDirEntryEnumerate pour scanner un à un les fichiers d'un dossier précédemment ouvert avec VFSFileOpen.
Mais aucun moyen d'ajouter le nom dans une liste ???
J'ai bien un formulaire avec une liste. Il me manque juste une API du style LstAddEntry(UInt16 listID, char* strP);
Je l'ai cherché sans succès !!
Je pense que je suis déformé par la programmation sous Windows.
Comment faites-vous pour remplir ce genre de liste ?
Merci
Ceci pourra peut-être te renseigner?
Fredouille.95
18/06/2006 à 21:13
Merci snark...
En lisant ta doc, je m'apperçois que la solution que j'avais adopté semble la seule.
J'arrive à afficher le contenu d'un dossier dans une liste.
Comme je débute en programmation sous Palm OS, mon programme n'est surement pas optimisé.
Voici quand même mon code :
Ce code est exécuté au chargement du formulaire
"
...
while (volIterator != vfsIteratorStop)
{
Result = VFSVolumeEnumerate(&volRefNum, &volIterator);
if (Result != errNone)
return;
Result = VFSFileOpen(volRefNum, DiskImagesPath, vfsModeRead, &dirRef);
if (Result == errNone)
{
dirFound = true;
break;
}
}
if (dirFound == false)
return;
FilenameP = MemPtrNew(256);
if (FilenameP == NULL)
{
VFSFileClose(dirRef);
return;
}
FileInfo.nameP = FilenameP;
FileInfo.nameBufLen = 256;
// Parcourir la liste pour savoir le nombre de fichiers.
NbFiles = 0;
while (dirEntryIterator != vfsIteratorStop)
{
Result = VFSDirEntryEnumerate(dirRef, &dirEntryIterator, &FileInfo);
if (Result == errNone)
{
NbFiles++;
}
}
FilenameListP = (char**)MemPtrNew(sizeof(tUChar*) * NbFiles);
if (FilenameListP == NULL)
{
VFSFileClose(dirRef);
MemPtrFree(FilenameP);
return;
}
FilenameEntry = FilenameListP;
dirEntryIterator = vfsIteratorStart;
while (dirEntryIterator != vfsIteratorStop)
{
Result = VFSDirEntryEnumerate(dirRef, &dirEntryIterator, &FileInfo);
if (Result == errNone)
{
*FilenameEntry = (char*)MemPtrNew(StrLen(FilenameP));
if (*FilenameEntry != NULL)
{
StrCopy(*FilenameEntry, FilenameP);
FilenameEntry++;
}
}
}
LstEraseList((ListType*)FrmGetObjectPtr(frmP, FrmGetObjectIndex(frmP, DriveFormImagesList)));
LstSetListChoices((ListType*)FrmGetObjectPtr(frmP, FrmGetObjectIndex(frmP, DriveFormImagesList)),
FilenameListP, NbFiles);
VFSFileClose(dirRef);
MemPtrFree(FilenameP);
"
Le code suivant est nécessaire et est exécuté à la fermeture du formulaire
"
...
if (FilenameListP != NULL)
{
FilenameEntry = FilenameListP;
for (Loop = 0; Loop < NbFiles; Loop++)
{
MemPtrFree(*(FilenameEntry++));
}
MemPtrFree(FilenameListP);
FilenameListP = NULL;
}
...
"