NSString到FSRef转换不起作用

时间:2009-08-15 00:17:47

标签: objective-c cocoa nsstring macos-carbon

对于我的应用程序,我需要使用Carbon文件管理器API来获取文件夹的大小(NSEnumerator很慢,使用带有shell命令的NSTask甚至更糟)。我已导入Carbon框架,我正在使用此方法来获取文件夹的大小:

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

它使用FSRef作为参数,我的路径字符串当前是NSString。我尝试使用它将NSString转换为FSRef:

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

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

然后我调用了文件夹大小方法:

[self fastFolderSizeAtFSRef:f];

然而,当我尝试构建时,我收到有关上述行的错误:

错误:'fastFolderSizeAtFSRef:'

参数之一的不兼容类型

任何帮助将不胜感激。感谢

1 个答案:

答案 0 :(得分:5)

“fastFolderSizeAtFSRef”方法采用FSRef *(FSRef指针)。你给它一个FSRef。幸运的是,这是一个字符修复。你有:

[self fastFolderSizeAtFSRef:f];

只需将其更改为:

[self fastFolderSizeAtFSRef:&f];

你应该好好去。但是,我昨天正在实施同样的方法,但是在创建FSRef本身时遇到了麻烦。我最终使用以下代码:

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;
}

这对我来说是完美无缺的。

编辑:我刚刚开源我正在使用它的代码。这是这些文件:

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