如何将NSString转换为可以与FSCreateDirectoryUnicode一起使用的东西?

时间:2009-06-10 12:11:10

标签: objective-c cocoa macos unicode filesystems

我是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 个答案:

答案 0 :(得分:4)

您的原始字符串数据存在一些问题。但是在Cocoa中最简单的方法是:

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返回字符串的外部表示。这意味着数据在开头包含一个unicode字节顺序标记,FSCreateDirectoryUnicode不需要。

答案 1 :(得分:0)

您的代码看起来不错。我会使用[unicode length] / 2作为长度,尽管在所有(或至少几乎所有)情况下它应该等于[theString length]。

或者,您可以使用Nathan Day的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的路径,然后是Nikolai的解决方案:

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