1

私のアプリでは、Carbon ファイル マネージャー API を使用してフォルダーのサイズを取得する必要があります (NSEnumerator は遅く、シェル コマンドで 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 の型に互換性がありません

どんな助けでも大歓迎です。ありがとう

4

1 に答える 1

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

これは私にとって完璧に機能しています。

編集:これを使用しているコードをオープンソース化しました。これらのファイルです:

このファイルは、FSRef を使用してディレクトリの完全なサイズを検出するメソッドを NSFileManager に追加しますこのファイルは、それを FSRef に変換するメソッドを NSString に追加します
このファイルの 46 行目ですべてが行われます

于 2009-08-15T00:58:32.780 に答える