0

Documents ディレクトリに次のファイルがある場合 -

Animals/Birds/file1.xyz
Animals/Birds/file2.xyz
Animals/Cats/file1.xyz
Cars/Ford/file1.xyz
Photos/MyAlbums/file1.xyz

そして、これらのファイルに があるとすれば、 を使用しNSArrayて、パスまたはパス/サブパスで配列をフィルタリングすることは可能ですか? 例えばNSURLsNSPredicate

  • 階層の最初のレベルにあるすべてのものの一意の名前 (動物、車、写真)
  • 第 2 レベルのすべての固有の名前 (鳥、猫)
  • Animals ディレクトリ内のファイル -- (/Animals)
  • Cats ディレクトリ内のファイル -- (/Animals/Cats)
4

2 に答える 2

3

これらは実際の Documents ディレクトリ内の実際のファイル URL であるため、 NSFileManager を使用しない理由はありませんcontentsOfDirectoryAtURL:。あなたが尋ねている質問(「Catsディレクトリ内のファイル」)に直接答えます。

または、より強力にするには、NSDirectoryEnumerator を使用してファイルを循環します。

于 2013-04-24T04:16:55.077 に答える
2

NSURL の配列を本当にフィルタリングしたい場合は、次のようにすることができます。

- (NSArray *)filteredArray:(NSArray *)originalArray withSubpath:(NSString *)subpath {
    NSPredicate *predicate = [NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) {
        NSURL *url = (NSURL *)evaluatedObject;
        NSRange range = [[url path] rangeOfString:subpath];
        return (range.location == 0);
    }];
    return [originalArray filteredArrayUsingPredicate:predicate];
}

これが私がそれをテストした方法です:

NSArray *urls = @[[NSURL URLWithString:@"Animals/Birds/file1.xyz"],
                  [NSURL URLWithString:@"Animals/Birds/file2.xyz"],
                  [NSURL URLWithString:@"Animals/Cats/file1.xyz"],
                  [NSURL URLWithString:@"Cars/Ford/file1.xyz"]];

NSLog(@"Before: %@", urls);
urls = [self filteredArray:urls withSubpath:@"Animals/Birds"];
NSLog(@"After: %@", urls);

出力ログは次のとおりです。

Before: (
    "Animals/Birds/file1.xyz",
    "Animals/Birds/file2.xyz",
    "Animals/Cats/file1.xyz",
    "Cars/Ford/file1.xyz"
)
After: (
    "Animals/Birds/file1.xyz",
    "Animals/Birds/file2.xyz"
)

: 部分文字列に一致するため、この場合、先頭のスラッシュのために "/Animals" には一致しません (配列と部分文字列の両方に「/」が含まれていない限り)。

于 2013-04-24T04:26:59.873 に答える