Как мне преобразовать NSString во что-то, что я могу использовать с FSCreateDirectoryUnicode? - PullRequest
2 голосов
/ 10 июня 2009

Я новичок в Mac и Objective-C, так что, возможно, я не туда лаю, и вполне возможно, что есть лучшие способы сделать это.

Я попробовал приведенный ниже код, и он не выглядит правильным. Кажется, я не получаю правильную длину в вызове FSCreateDirectoryUnicode. Какой самый простой способ сделать это?

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

Ответы [ 2 ]

4 голосов
/ 10 июня 2009

Есть несколько проблем с вашими необработанными строковыми данными. Но самый простой способ сделать это в Какао:

NSString *theString = @"MyFolderName";

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

Вы использовали FSRef, чтобы указать путь к каталогу, в котором он был создан. В моем примере вместо этого используется домашний каталог. Если вам действительно нужно использовать каталог в FSRef и не знать путь к нему, возможно, будет проще использовать функцию FSCreateDirectoryUnicode:

Редактировать: изменен код для использования правильной кодировки.

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

Единственное, что было нарушено в исходном коде, это то, что dataUsingEncoding возвращает внешнее представление строки. Это означает, что данные в начале содержат метку порядка байтов в Юникоде, которую FSCreateDirectoryUnicode не хочет.

0 голосов
/ 11 июня 2009

Ваш код выглядит нормально. Я бы использовал [длину юникода] / 2 в качестве длины, хотя она должна быть равна [длине строки) во всех (или, по крайней мере, почти во всех) случаях.

Кроме того, вы можете использовать категорию NDAlias ​​NSString + NDCarbonUtilities Натана Дея

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

, чтобы получить путь для вашего FSRef, а затем решение Николая:

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