Poids d'un dossier

07:39 modifié dans API AppKit #1
Bonjour,

je cherche à  obtenir la poids d'un dossier.
J'utilise :
<br />NSDictionary*	_fileAttributes = [_fileManager fileAttributesAtPath:_path traverseLink:NO];<br />long long		size = [[_fileAttributes objectForKey:@&quot;NSFileSize&quot;] longLongValue];<br />


Le problème est que j'obtiens tjrs du 324 octets alors que le dossier pèse 226.1Mo
Alors je suppose que le poids du dossier est bien correct... mais il ne compte pas le contenu ?
Alors avez-vous un autre moyen pou récuprer le poids d'un dossier CORRECTEMENT  ;D ?

Merci d'avance,
Louka

Réponses

  • aranaudaranaud Membre
    07:39 modifié #2
    Il me semble qui faut additionner toutes les poids de tous les fichiers qui contient.
  • 07:39 modifié #3
    Génial  :o ça va être super marrant  :-\\ Moi qui pensais qu'il y avait un autre moyen, une méthode même...
  • aranaudaranaud Membre
    07:39 modifié #4
    J'ai déjà  vu une solution qui employait c'est méthode sur internet (désolé, j'ai pu l'adresse), mais si mes souvenir sont bon. Environs 25 lignes suffisait.
  • avril 2006 modifié #6
    Salut,

    J'ai pas trop regardé le topic qu'a fourni Renaud car je venais de finir de lister le contenu d'un dossier ds un popup en tenant compte des sous-dossiers etc...
    Ducoup, récupérer le poids d'un bundle me paraissait bcp plus simple. Alors j'ai fait :
    <br />- (long long)sizeForBundle:(NSString*)path<br />{<br />	NSFileManager*			_fileManager = [NSFileManager defaultManager];<br />	NSArray*				_dirArray = [_fileManager directoryContentsAtPath:path];<br />	NSEnumerator*			_direnum = [_dirArray objectEnumerator];<br />	NSString *name;<br />	NSString*	_itemPath;<br />	long long size = 0;<br />	<br />	if([_dirArray count]==0)<br />		size+= [[[_fileManager fileAttributesAtPath:path traverseLink:NO] objectForKey:@&quot;NSFileSize&quot;] longLongValue];<br />	<br />	while (name = [_direnum nextObject]){<br />		BOOL isDir;<br />		_itemPath = [NSString stringWithFormat:@&quot;%@/%@&quot;, path, name];<br />		<br />		if([_fileManager fileExistsAtPath:_itemPath isDirectory:&amp;isDir]&amp;&amp;isDir)<br />			size+= [self sizeForBundle:_itemPath];<br />		else if([_fileManager fileExistsAtPath:_itemPath isDirectory:&amp;isDir]&amp;&amp;!isDir)<br />			size+= [[[_fileManager fileAttributesAtPath:_itemPath traverseLink:NO] objectForKey:@&quot;NSFileSize&quot;] longLongValue];<br />	}<br />	<br />	return size;<br />}<br />
    


    J'obtiens bien le bon poids à  quelques Ko près (331ko au lieu de 448Ko par exemple)
  • AliGatorAliGator Membre, Modérateur
    07:39 modifié #7
    Pourtant tu aurais dû lire le post fourni par Renaud y'a pas mal de solutions à  ce sujet.
    En particulier aussi la commande "du" qui donne la place utilisée sur le disque (disk usage) d'un dossier et ce en un temps record... Même si c'est pas tout à  fait la taille donnée par le Finder (à  qques Ko près, là  aussi), pour les raisons expliquées dans ledit post...
  • tabliertablier Membre
    07:39 modifié #8
    Je pense que j'ai déjà  calculé la taille d'un dossier. Attention: mon but était d'obtenir la même information que celle délivrée par le Finder dans la fenêtre d'info. Noter qu'il y a quelques pièges, notamment avec les liens UNIX.

    Je vous livre directement la méthode que j'utilise:

    // calcul de la taille d'un dossier ou d'un "package"
    // input:  chemin est le "path" du dossier ou du package.  ***Not use with Volume***
    // return: la taille cherchée.
    //
    - (unsigned long long)PackSize:(NSString *)chemin :(NSFileManager *)gestion
    {
    long ret;
    FSRef fRef;
    NSString *pname, *qname ;
    NSDictionary *fattrs ;
    FSCatalogInfo catInfo;
    unsigned long long P_Size ;

    NSString *LaBase = [chemin stringByAppendingString:@/] ;                    // traitement du chemin
    NSDirectoryEnumerator *direnum = [gestion enumeratorAtPath:chemin] ;  // prépare l'énumération.
    P_Size = 0 ;

    while (pname = [direnum nextObject])  {                                              // boucle d'énumération FSSpec

    qname = [LaBase stringByAppendingString:pname] ;                      // nom complet d'un item
    ret= FSPathMakeRef((const UInt8 *)[qname UTF8String],&fRef, 0) ;  // fait un fRef
    fattrs = [gestion fileAttributesAtPath:qname traverseLink:NO];          // prise des attributs
    ret=FSGetCatalogInfo(&fRef, KFS_a_moi, &catInfo, NULL, NULL, NULL); // prise des infos.

    if ([[fattrs fileType] compare:NSFileTypeSymbolicLink] == NSOrderedSame)
                            P_Size += [fattrs fileSize] ;                                        // si lien sans partie ressource
    else if (!(catInfo.nodeFlags & kFSNodeIsDirectoryMask))                  // autre que dossier, package, volume ?
                            P_Size += catInfo.dataLogicalSize + catInfo.rsrcLogicalSize ;
    } ;

    return (P_Size);
    }


    J'espère que vous ne trouverez pas de faille!
    A+
  • maconnectmaconnect Membre
    07:39 modifié #9
    Salut,
    joli code. Remplace juste "stringByAppendingString:pname" par "stringByAppendingPathComponent:pname" ainsi que "UTF8String" par "fileSystemRepresentation" et voilà 
    N'utilise pas utf8string, on sait jamais.
  • tabliertablier Membre
    07:39 modifié #10
      Tout mes sources sont en UTF8 (sauf les scripts) et je n'ai jamais de problème, alors Quel est le risque si j'utilise UTF8 partout? ou est-ce que ça va coincer?

  • AliGatorAliGator Membre, Modérateur
    07:39 modifié #11
    Ici tu manipules des chemins de fichiers.
    Il se trouve que les noms de fichiers sont stoqués en UTF16 si je ne m'abuse
    Et puis même si c'était de l'UTF8 ça te garantirait pas que ça reste comme ça tout le temps)

    Il se trouve que l'UTF8 est ainsi fait que, si je ne dis pas de bétise, une chaà®ne avec des caractères standards qui reste dans les codes unicode bas est codée pareil en UTF8 et UTF16.
    Mais quand tu pars dans des caractères qui ont des codes Unicode plus grands, le codage sera justement différent en UTF8 et UTF16.

    C'est comme l'ISO-Latin-1 qui contient la table ASCII : tant que tu utilises des caractères de la table ASCII (< 128), la table de caractères est la même. Mais au dela les codagse diffèrent.

    Bref, pour un système en japonais ou autre langages qui commence à  partir dans les aux codes unicodes pour les caractères utilisés, tu risques d'avoir des surprises.
  • maconnectmaconnect Membre
    07:39 modifié #12
    j'ai pas l'explication scientifique, mais ce que je sais c'est que UTF8String j'ai réussi à  le faire planter une fois. Et que l'autre fonctionne toujours, d'ailleurs c'est la méthode officielle... voila  8)
Connectez-vous ou Inscrivez-vous pour répondre.