2009-08-15 18 views
1

私のアプリケーションでは、CarbonファイルマネージャAPIを使用してフォルダのサイズを取得する必要があります(NSEnumeratorは遅く、NSTaskをシェルコマンドで使用するとさらに悪化します)。私は、Carbonフレームワークをインポートした、と私は、フォルダのサイズを取得するには、このメソッドを使用しています:NSStringからFSRefへの変換が機能しない

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

それは、引数としてのFSRefを使用し、私のパス文字列が現在NSStringのです。

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

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

そして私は、フォルダサイズメソッドを呼び出し::私はのFSRefにNSStringのを変換するために、これを使用してみました

[self fastFolderSizeAtFSRef:f]; 

私が構築しようとすると、しかし、私は上記の行について、このエラーを取得します:

エラー:引数のいずれかの互換性のない型 'fastFolderSizeAtFSRef:'

任意の助けいただければ幸いです。ありがとう

答えて

5

"fastFolderSizeAtFSRef"メソッドは、FSRef *(FSRefポインタ)を取ります。あなたはそれにFSRefを与えています。幸いなことに、1文字の修正です。あなたは持っている:

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

これは完璧に働いています。

EDIT:私はちょうど開いた私は、この中を使用していたコードをソースのそれは、これらのファイルです:

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

こんにちはデイブ、 ありがとうございました。私はクラスに入れて、これを試しました: [自己convertNSStringToFSRef:ファイルパス]]; ここで、filePathはパスを含むNSStringです。そして、私は "警告 'AppController'が '-convertNSStringToFSRef'に応答しないことがあります。私はあなたの方法を間違った方法と呼んでいると感じています... ありがとう – indragie

+0

ええ、私はCの関数として書いています。メソッドとして使いたい場合は、最初の行を ' - (FSRef)convertNSStringToFSRef:(NSString *)theString {'に変更してください。アンパサンドを忘れないで!このメソッドはFSRefを返します。上記のように、fastFolderSizeメソッドはFSRefポインタを要求します。私はもう少しの情報で私の答えを編集しています... –

+0

ありがとうDave、私はそれらの2つの方法を私のアプリで使用する許可を得ることができますか? NSFileManager + FileSize.mのものS.私のアプリはフリーウェアです(おそらくオープンソース):) – indragie

関連する問題