2009-08-15 7 views
1

Pour mon application, j'ai besoin d'utiliser l'API du gestionnaire de fichiers Carbon pour obtenir la taille d'un dossier (NSEnumerator est lent, et l'utilisation de NSTask avec une commande shell est encore pire). J'ai importé le cadre de carbone, et j'utilise cette méthode pour obtenir la taille d'un dossier:La conversion NSString vers FSRef ne fonctionne pas

http://www.cocoabuilder.com/archive/message/cocoa/2005/5/20/136503

Il utilise un FSRef comme argument, et ma chaîne de chemin est actuellement NSString. J'ai essayé d'utiliser pour convertir le NSString à un FSRef:

FSRef f; 
     OSStatus os_status = FSPathMakeRef((const UInt8 *)[filePath fileSystemRepresentation], &f, NULL); 

     if (os_status != noErr) { 
      NSLog(@"fsref creation failed"); 
     } 

Et puis j'ai appelé la méthode de la taille du dossier:

[self fastFolderSizeAtFSRef:f]; 

Cependant lorsque je tente de construire, je reçois cette erreur en ce qui concerne la ligne ci-dessus :

erreur: type incompatible pour l'un des arguments 'fastFolderSizeAtFSRef:'

Toute aide serait appréciée. Merci

Répondre

5

La méthode "fastFolderSizeAtFSRef" prend un FSRef * (FSRef pointeur). Vous lui donnez un FSRef. C'est une correction d'un caractère, heureusement assez. Vous avez:

[self fastFolderSizeAtFSRef:f]; 

changer simplement que, pour:

[self fastFolderSizeAtFSRef:&f]; 

Et vous devriez être bon d'aller. Cependant, j'utilisais la même méthode hier mais j'avais du mal à créer le FSRef lui-même. J'ai finalement allé avec le code suivant:

FSRef convertNSStringToFSRef(NSString * theString) { 
    FSRef output; 
    const char *filePathAsCString = [theString UTF8String]; 
    CFURLRef url = CFURLCreateWithBytes(kCFAllocatorDefault, 
             (const UInt8 *)filePathAsCString, 
             strlen(filePathAsCString), 
             kCFStringEncodingUTF8, 
             NULL); 
    CFURLGetFSRef(url, &output); 
    CFRelease(url); 
    return output; 
} 

Cela a fonctionné parfaitement pour moi.

EDIT: Je viens en open source le code que j'utilise ceci dans Ce sont ces fichiers.

This file adds a method to NSFileManager that uses an FSRef to find the complete size of a directory. This file adds a method to NSString that will convert it to an FSRef.
Everything happens on line 46 of this file.

+0

Salut Dave, Merci pour cette méthode. Je l'ai mis dans ma classe et j'ai ensuite essayé ceci: [self fastFolderSizeAtFSRef: [self convertNSStringToFSRef: filePath]]; Où filePath est mon NSString contenant le chemin. Et je reçois un "avertissement 'AppController" peut ne pas répondre à' -convertNSStringToFSRef '". J'ai le sentiment que j'appelle votre méthode dans le mauvais sens ... Merci – indragie

+0

Oui, je l'ai écrit comme une fonction C. Si vous le voulez comme méthode, changez la première ligne en '- (FSRef) convertNSStringToFSRef: (NSString *) theString {'. Alors n'oublie pas cette esperluette! Cette méthode retourne un FSRef, et comme j'ai déjà répondu ci-dessus, la méthode fastFolderSize veut un pointeur FSRef. Je suis en train d'éditer ma réponse avec un peu plus d'informations ... –

+0

Merci Dave, puis-je avoir la permission d'utiliser ces 2 méthodes dans mon application? Ceux dans NSFileManager + FileSize.m? P.S. Mon application est freeware (et éventuellement Open source) :) – indragie