0

Appleの「ComplexBrowser」のサンプルを理解しようとしていますが、「CFURLEnumeratorCreateDirectoryURL」の資料/チュートリアルを見つけるのは非常に困難です。

AppleのComplexBrowserサンプル

このコードで正確に何が起こっているのでしょうか?

CFURLEnumeratorGetNextURLなどでループするこの方法を理解していませんでした。

私にとって、NSFileManagerを使用したアプローチは単純に見えますが、より制限されていますか?

NSArray * contentsAtPath = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:parentPath error:NULL];

- (NSArray *)children {
if (_children == nil || _childrenDirty) {
    // This logic keeps the same pointers around, if possible.
    NSMutableArray *newChildren = [NSMutableArray array];

    CFURLEnumeratorRef enumerator = CFURLEnumeratorCreateForDirectoryURL(NULL, (CFURLRef) _url, kCFURLEnumeratorSkipInvisibles, (CFArrayRef) [NSArray array]);
    NSURL *childURL = nil;
    CFURLEnumeratorResult enumeratorResult;
    do {
        enumeratorResult = CFURLEnumeratorGetNextURL(enumerator, (CFURLRef *) &childURL, NULL);
        if (enumeratorResult == kCFURLEnumeratorSuccess) {
            FileSystemNode *node = [[[FileSystemNode alloc] initWithURL:childURL] autorelease];
            if (_children != nil) {
                NSInteger oldIndex = [_children indexOfObject:childURL];
                if (oldIndex != NSNotFound) {
                    // Use the same pointer value, if possible
                    node = [_children objectAtIndex:oldIndex];
                }
            }
            [newChildren addObject:node];
        } else if (enumeratorResult == kCFURLEnumeratorError) {
            // A possible enhancement would be to present error-based items to the user.
        }
    } while (enumeratorResult != kCFURLEnumeratorEnd);

    [_children release];
    _childrenDirty = NO;
    // Now sort them
    _children = [[newChildren sortedArrayUsingComparator:^(id obj1, id obj2) {
        NSString *objName = [obj1 displayName];
        NSString *obj2Name = [obj2 displayName];
        NSComparisonResult result = [objName compare:obj2Name options:NSNumericSearch | NSCaseInsensitiveSearch | NSWidthInsensitiveSearch | NSForcedOrderingSearch range:NSMakeRange(0, [objName length]) locale:[NSLocale currentLocale]];
        return result;
    }] retain];
}

return _children;

}

4

1 に答える 1

1

この情報は不透明なCデータ型で格納されるため、Core Foundationでは、データに関する情報を提供するCルーチンを提供します。これはカプセル化の形式であるため、舞台裏で物事を変更し、ライブラリのパブリックインターフェイスに影響を与えることはありません。

基本的に、ループを作成し、ディレクトリの終わりが見つかるまで、ディレクトリから次のURLを要求し続けます。

  • enumeratorURLのリストのどこにあるかを追跡する一種のインデックスです。
  • enumeratorResult新しいURLを取得したかどうか(またはエラーがあるか、最後のレコードにあるかどうか)を示します。

各URLを通過するときに、を作成FileSystemNodeして配列に追加し、ディレクトリ内のすべてのURLのループが完了すると、配列を返します。

于 2012-03-28T19:57:44.733 に答える