2009-06-10 6 views
2

Je suis nouveau sur Mac et Objective-C, je suis peut-être en train d'aboyer le mauvais arbre ici et il y a de bonnes façons de le faire.Comment convertir un NSString en quelque chose que je peux utiliser avec FSCreateDirectoryUnicode?

J'ai essayé le code ci-dessous et cela ne me semble pas correct. Il semble que je n'ai pas la bonne longueur dans l'appel à FSCreateDirectoryUnicode. Quelle est la manière la plus simple d'accomplir ceci?

NSString *theString = @"MyFolderName"; 
NSData *unicode = [theString dataUsingEncoding:NSUnicodeStringEncoding allowLossyConversion:NO]; 
FSCreateDirectoryUnicode(&aFolderFSRef, [theString length], [unicode bytes], kFSCatInfoNone, NULL, &newFolderFSRef, NULL, NULL); 

Répondre

4

Il existe un certain nombre de problèmes avec vos données de chaîne brute. Mais la meilleure façon de le faire à Cocoa est:

NSString *theString = @"MyFolderName"; 

NSString* path = [NSHomeDirectory() stringByAppendingPathComponent:theString]; 
[[NSFileManager defaultManager] createDirectoryAtPath:path 
              attributes:nil]; 

Vous avez utilisé un FSRef pour indiquer le chemin à l'endroit où le répertoire a été créé. Mon exemple utilise le répertoire principal à la place. Si vous devez vraiment utiliser le répertoire dans FSRef et que vous ne connaissez pas le chemin, il peut être plus facile d'utiliser la fonction FSCreateDirectoryUnicode:

Édition: modification du code pour utiliser le codage correct.

NSString *theString = @"MyFolderName"; 
const UniChar* name = (const UniChar*)[theString cStringUsingEncoding:NSUnicodeStringEncoding]; 
FSCreateDirectoryUnicode(&aFolderFSRef, [theString length], name, kFSCatInfoNone, NULL, &newFolderFSRef, NULL, NULL); 

La seule chose qui a été brisé dans le code d'origine, était que dataUsingEncoding retourne la représentation externe de la chaîne. Cela signifie que les données contiennent une marque d'ordre d'octet unicode au début, ce que FSCreateDirectoryUnicode ne veut pas.

+0

Merci - qui a aidé! (après avoir réalisé que FSFileManager doit être NSFileManager) – staffan

+1

FSCreateDirectoryUnicode attend une chaîne de caractères UniChar 16 bits, pas une chaîne UTF8, de sorte que le second exemple ne fonctionnera pas. –

+0

Honte à moi: une erreur grave et une faute de frappe dans une réponse. Réponse éditée pour l'exactitude, désolé pour la confusion. Merci Peter. –

0

Votre code semble OK. J'utiliserais [length unicode]/2 comme longueur, bien que cela soit égal à [theString length] dans tous les cas (ou au moins dans presque tous les cas).

Vous pouvez également utiliser NDAlias ​​Nathan Day NSString + NDCarbonUtilities catégorie

+ (NSString *)stringWithFSRef:(const FSRef *)aFSRef 
{ 
    NSString  * thePath = nil; 
    CFURLRef theURL = CFURLCreateFromFSRef(kCFAllocatorDefault, aFSRef); 
    if (theURL) 
    { 
     thePath = [(NSURL *)theURL path]; 
     CFRelease (theURL); 
    } 
    return thePath; 
} 

pour obtenir le chemin de votre FSRef puis la solution de Nikolai:

NSString* aFolderPath = [NSString stringWithFSRef:aFolderFSRef]; 
NSString* path = [aFolderPath stringByAppendingPathComponent:theString]; 
[[FSFileManager defaultManager] createDirectoryAtPath:path attributes:nil]; 
Questions connexes