对于我的应用程序,我需要使用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:'
参数之一的不兼容类型任何帮助将不胜感激。感谢
答案 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 directory。
This file adds a method to NSString that will convert it to an FSRef。
Everything happens on line 46 of this file