[Carbon] Rechercher des fichiers dans un dossier

Niamorh

Membre confirmé
7 Mars 2007
30
0
39
Bonjour,

j'essaye de faire ca avec :

FSPathMakeRef

FSOpenIterator

FSCatalogSearch

mais je n'y arrive pas malgré tous mes essais. comment s'en sert-on ?
 
oui je suis sur cette ref depuis plusieurs jour sans obtenir de resultats..

je n'arrive pas à me servir de la structure FSSearchParams correctement pour appeller FSCatalogSearch

Je ne trouve pas de source simple qui montre comment initialiser la structure.
 
oui je suis sur cette ref depuis plusieurs jour sans obtenir de resultats..

je n'arrive pas à me servir de la structure FSSearchParams correctement pour appeller FSCatalogSearch

Je ne trouve pas de source simple qui montre comment initialiser la structure.

Tu as cherché FSCatalogSearch dans les exemples Apple ?

Cordialement
 
oui, il n'y a que GrabBag - /CatSearchThread.c qui tombe comme reponse

cela ne fait pas exactement ce que je veux mais des que j'essaie d'adapter le code j'obtiens des resultats pas exellents : http://www.developpez.net/forums/showthread.php?t=302074

Je dois avouer, que pour mes recherches de fichier j'utilise "FSOpenIterator" puis je recupere les résultats "à la main" et j'applique mes propres filtres. Je ne sais plus pourquoi.
Peut etre un probleme avec "FSCatalogSearch" ? Je ne me rappelle plus.

Apres, entree par entrée je passe par "FSGetCatalogInfoBulk".

C'est un code qui fonctionne depuis des années sans probleme.

Cordialement
 
salut,

qu'entends-tu par "a la main", et par "j'applique mes propres filtres" ? Tu veux dire que tu parcoures tous les fichiers d'un dossier sans utiliser les options de filtre de carbon et que tu fais des tests sur ce que tu récupère toi même ?

En clair tu me conseille d'utiliser FSGetCatalogInfoBulk plutot que FSCatalogSearch ? je vais essayer de faire des tests avec. Mon but est juste de recuperer les noms de fichiers.

Pourrais tu me montrer un bout de code qui marche pour le parcours des fichiers, si tu en as sous la main ?

merci.
 
salut,

qu'entends-tu par "a la main", et par "j'applique mes propres filtres" ? Tu veux dire que tu parcoures tous les fichiers d'un dossier sans utiliser les options de filtre de carbon et que tu fais des tests sur ce que tu récupère toi même ?

En clair tu me conseille d'utiliser FSGetCatalogInfoBulk plutot que FSCatalogSearch ? je vais essayer de faire des tests avec. Mon but est juste de recuperer les noms de fichiers.

Pourrais tu me montrer un bout de code qui marche pour le parcours des fichiers, si tu en as sous la main ?

merci.


Oui c'est ca.

Je vais essayer d'extraire ceci de mon code (c'est pas évident car mon code marche sous Carbon, Pas carbon et Windows) :

{
/* On cree un iterator */
FSSpec fspec;
FSRef fsref;
OSErr err;

finfo->iterator=NULL;
err=FSMakeFSSpec(0/* Volume courant */,finfo->dirId,(StringPtr)"",&fspec);
if(err==noErr)
{
/* Creation du FSRef */
err=FSpMakeFSRef(&fspec,&fsref);
if(err==noErr)
{
/* Creation de l'iterateur */
err=FSOpenIterator(&fsref,kFSIterateFlat,&finfo->iterator);
}
}
Et pour chaque extraction de fichier :

{
ItemCount actualObjects;
HFSUniStr255 unicodeName;
FSCatalogInfo catalogInfo;
FSRef documentFSRef;

err=FSGetCatalogInfoBulk(finfo->iterator,1,&actualObjects,NULL,kFSCatInfoNodeFlags,&catalogInfo,&documentFSRef,NULL,&unicodeName);
if(err==noErr)
{
CFStringRef strRef;

/* Extraction des informations du node suivant*/
strRef=CFStringCreateWithCharacters(kCFAllocatorDefault, unicodeName.unicode, unicodeName.length);
if(!CFStringGetCString(strRef, chaine, MAX_VAL_NAME_LENGTH, kCFStringEncodingUTF8))
{
/* Erreur a la conversion de nom */
strcpy(chaine,"");
}
else
{
/* Dois t'on extraire les noms de dossier ? */
if(catalogInfo.nodeFlags & kFSNodeIsDirectoryMask)
{
if(finfo->masqueAttrib&_A_SUBDIR) Ok=true;
else Ok=false;
finfo->attrib=_A_SUBDIR;
}
else
Ok=IsFileMatchMask(chaine,finfo->masque);
}
CFRelease(strRef);
}
else
return(err);
}

Cordialement
 
impec j'ai rapidement adapté ton code et j'optiens ce que je veux :

Bloc de code:
#include <CoreServices/CoreServices.h>
 #include <iostream>
 
 
int main()
{

  FSRef fs_rep;
  
  FSIterator fs_it;
  
   if (FSPathMakeRef((unsigned char*)"/Users/lionelfages/Desktop/test/", &fs_rep, 0) == fnfErr)
  {  
	fprintf(stderr,"Repertoire non trouve %s\n","lkjh");
	return 0;
  }
  
  if (FSOpenIterator(&fs_rep, kFSIterateFlat, &fs_it))
  {
    fprintf(stderr,"Iterateur non valide %s\n","ljkhglj");
    return 0;
  }
  


ItemCount actualObjects;
HFSUniStr255 unicodeName;
FSCatalogInfo catalogInfo;
FSRef documentFSRef;

OSErr err;

err=FSGetCatalogInfoBulk(fs_it,1,&actualObjects,NULL,kFSCatInfoNodeFlags,&catalogInfo,&documentFSRef,NULL,&unicodeName);
while(err==noErr)
{
	CFStringRef strRef;
	char * chaine;
	
	/* Extraction des informations du node suivant*/
	strRef=CFStringCreateWithCharacters(kCFAllocatorDefault, unicodeName.unicode, unicodeName.length);
	if(!CFStringGetCString(strRef, chaine, 256, kCFStringEncodingUTF8))
	{
		/* Erreur a la conversion de nom */
		strcpy(chaine,"");
	}
	else
	{
		/* Dois t'on extraire les noms de dossier ? */
		if(catalogInfo.nodeFlags & kFSNodeIsDirectoryMask)
		{
			//if(finfo->masqueAttrib & _A_SUBDIR) Ok=true;
			//else Ok=false;
			//finfo->attrib=_A_SUBDIR;
		  fprintf(stderr,"hello dossier %s\n", chaine);
		}
		else
		  fprintf(stderr,"hello fichier %s\n", chaine);
			//Ok=IsFileMatchMask(chaine,finfo->masque);
	}
	CFRelease(strRef);
	err=FSGetCatalogInfoBulk(fs_it,1,&actualObjects,NULL,kFSCatInfoNodeFlags,&catalogInfo,&documentFSRef,NULL,&unicodeName);
}
return(err);
}

Attention car j'ai vu que tu te servais de FSMakeFSSpec qui est déclaré comme deprecated dans la ref apple. ;)

merci encore a toi