2009-08-15 64 views
1

对于我的应用程序,我需要使用Carbon文件管理器API来获取文件夹的大小(NSEnumerator速度慢,并且使用带有shell命令的NSTask更糟糕)。我已经导入了碳框架,我使用这个方法来得到一个文件夹的大小:NSString到FSRef转换不起作用

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:'

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

回答

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

+0

嗨戴夫, 感谢您的方法。我把它放在我的课堂上,然后试试这个: [self fastFolderSizeAtFSRef:[self convertNSStringToFSRef:filePath]]; 其中filePath是包含路径的我的NSString。我得到一个“警告”AppController'可能不会响应'-convertNSStringToFSRef'“。我有一种感觉,我打电话给你的方法是错误的... 谢谢 – indragie 2009-08-15 01:07:57

+0

是的,我把它写成C函数。如果您希望将其作为方法,请将第一行更改为' - (FSRef)convertNSStringToFSRef:(NSString *)theString {'。那么请不要忘记&符号!这个方法返回一个FSRef,就像我上面回答的那样,fastFolderSize方法需要一个FSRef指针。我正在编辑我的答案,提供更多信息... – 2009-08-15 01:22:51

+0

感谢戴夫,我可以在我的应用程序中使用这两种方法吗?那些在NSFileManager + FileSize.m? P.S.我的应用程序是免费的(也可能是开源的):) – indragie 2009-08-15 01:39:39