1

对于我的应用程序,我需要使用 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:”的参数之一的类型不兼容

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

4

1 回答 1

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

这对我来说一直完美无缺。

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

该文件向 NSFileManager 添加了一个方法,该方法使用 FSRef 来查找目录的完整大小该文件向 NSString 添加了一个方法,该方法会将其转换为 FSRef
一切都发生在这个文件的第 46 行

于 2009-08-15T00:58:32.780 回答