Dossier vide?

tabliertablier Membre
15:17 modifié dans API AppKit #1
J'ai besoin de savoir si un dossier est vide de fichier. Je dois le considérer comme vide même s'il contient des fichiers "transparents".
contentsOfDirectoryAtPath:  ne marche pas car le file manager compte tout les fichiers.
attributesOfItemAtPath:    ne donne pas l'information
J'ai bien trouvé contentsOfDirectoryAtURL:includingPropertiesForKeys:options:error: qui devrait me dire si un fichier particulier est transparent ou non. Il me reste à  faire des boucles pour trouver ce que je cherche.

Y-t-il quelque chose de plus simple pour trouver quel est le nombre de fichier d'un dossier qui seront affichés par le "finder" ?

Réponses

  • mpergandmpergand Membre
    15:17 modifié #2
    Je ne connais pas de méthode toute faite.

    La seule méthode fiable est d'utiliser LSCopyItemInfoForRef ou LSCopyItemInfoForURL
    <br />+(OSStatus) getItemInfoFlags:(LSItemInfoFlags*) flags filePath:(NSString*) filePath<br />{<br />	LSRequestedInfo requestInfo= kLSRequestAllFlags;<br />	LSItemInfoRecord infoRecord;<br />	FSRef fRef;<br />	OSStatus err;<br />	const UInt8 *filePathStr=(const UInt8 *)[filePath fileSystemRepresentation];<br />	<br />	if(!(err=FSPathMakeRef(filePathStr,&amp;fRef,nil)))<br />		{<br />		if(!(err=LSCopyItemInfoForRef(&amp;fRef,requestInfo,&amp;infoRecord)))<br />			{	<br />			*flags=infoRecord.flags;<br />			return noErr;<br />			}<br />		}<br /><br />	*flags=0;<br />	return err;<br />	<br />}<br /><br />// teste fichier invisible<br /><br />+(BOOL) isInvisibleFileAtPath:(NSString*) filePath<br />{<br />	LSItemInfoFlags flags;<br />	<br />	[self getItemInfoFlags:&amp;flags filePath:filePath]<br />		<br />	return ((flags &amp; kLSItemInfoIsInvisible)&gt;0);<br />}<br /><br />
    
  • tabliertablier Membre
    15:17 modifié #3
      B)   Bon sang! j'ai la mémoire courte! j'ai déjà  utilisé ces routines et je les ai oublié!
    A ma décharge, il faut dire qu'en objective-C on ne les trouve pas directement!
      :P  Merci du rappel
  • tabliertablier Membre
    janvier 2011 modifié #4
    La seule méthode fiable est d'utiliser LSCopyItemInfoForRef ou LSCopyItemInfoForURL
    J'ai essayé une autre solution. A mon avis, en background c'est aussi "LSCopyItemInfoForURL" qui est utilisé.
    Dans cette solution et suivant la valeur de "dossier", on obtient tout les items affichés par le finder ou seulement les items de type dossier (package compris).
    - (NSArray *)visibleItem:(NSString *)leChemin prop:(BOOL)dossier<br />{<br />NSMutableArray	*contient;<br />NSArray			*lesURL, *doss ;<br />NSError			*erreur ;<br /><br />	doss = [NSArray arrayWithObject:NSURLIsDirectoryKey] ;<br />	contient = [NSMutableArray arrayWithCapacity:100] ;<br />	lesURL = [[NSFileManager defaultManager] contentsOfDirectoryAtURL:[NSURL URLWithString:leChemin]<br />				includingPropertiesForKeys: (dossier ? doss : [NSArray array])<br />				options:NSDirectoryEnumerationSkipsHiddenFiles+NSDirectoryEnumerationSkipsSubdirectoryDescendants <br />						error:NULL] ;<br />	for (id lURL in lesURL)<br />	{ 	if (!dossier || [[[lURL resourceValuesForKeys:doss error:&amp;erreur] valueForKey:NSURLIsDirectoryKey] boolValue] )<br />			[contient addObject:[lURL&nbsp; path]] ; } ;	<br />	return [NSArray arrayWithArray:contient] ;	<br />}
    
Connectez-vous ou Inscrivez-vous pour répondre.