5

-[NSFileManager contentsOfDirectoryAtURL:includingPropertiesForKeys:options:error:]ディレクトリの内容を収集するときにディレクトリ名を除外するようにメソッドに指示する方法はありますか?

フォルダーを表示するツリー ビューがあり、テーブル ビューにファイルのみを表示したいのですが、フォルダーを除外するキーやその他の方法が見つからないようです。返された配列を繰り返し処理して、データ ソースとして使用される 2 番目の配列にファイルのみを詰め込むことができると思いますが、この二重処理は少し危険に思えます。

がディレクトリの場合はメソッドnilから戻ることも試みましたが、それはテーブルの空白行になるだけなので、それもダメです。tableView:viewForTableColumn:row:NSURL

NSFileManagerファイルだけが欲しいことを伝える方法は確かにありますか?

4

3 に答える 3

15

ディレクトリ列挙子を使用して、もう少し深くすることができます。

これはどう?

NSDirectoryEnumerator *dirEnumerator = [localFileManager enumeratorAtURL:directoryToScan includingPropertiesForKeys:[NSArray arrayWithObjects:NSURLNameKey, NSURLIsDirectoryKey,nil] options:NSDirectoryEnumerationSkipsSubdirectoryDescendants  errorHandler:nil];
NSMutableArray *theArray=[NSMutableArray array];

for (NSURL *theURL in dirEnumerator) {

    // Retrieve the file name. From NSURLNameKey, cached during the enumeration.
    NSString *fileName;
    [theURL getResourceValue:&fileName forKey:NSURLNameKey error:NULL];

    // Retrieve whether a directory. From NSURLIsDirectoryKey, also
    // cached during the enumeration.

    NSNumber *isDirectory;
    [theURL getResourceValue:&isDirectory forKey:NSURLIsDirectoryKey error:NULL];


    if([isDirectory boolValue] == NO)
    {
        [theArray addObject: fileName];
    }
}

// theArray at this point contains all the filenames
于 2013-08-03T01:24:22.527 に答える
11

最適なオプションはenumeratorAtURL:includingPropertiesForKeys:options:errorHandler:、フォルダーを除外する配列を作成するために使用することです。

NSFileManager *fm = [[NSFileManager alloc] init];
NSDirectoryEnumerator *dirEnumerator = [fm enumeratorAtURL:directoryToScan
                    includingPropertiesForKeys:@[ NSURLNameKey, NSURLIsDirectoryKey ]
                    options:NSDirectoryEnumerationSkipsHiddenFiles | NSDirectoryEnumerationSkipsSubdirectoryDescendants
                    errorHandler:nil];

NSMutableArray *fileList = [NSMutableArray array];

for (NSURL *theURL in dirEnumerator) {
    NSNumber *isDirectory;
    [theURL getResourceValue:&isDirectory forKey:NSURLIsDirectoryKey error:NULL];
    if (![isDirectory boolValue]) {
        [fileList addObject:theURL];
    }
}

NSURLこれにより、ファイルを表すオブジェクトの配列が得られます。

于 2013-08-03T01:24:30.603 に答える
3

ディレクトリを含むコンテンツを取得し、そこからそれらを切り詰める方法はありませんが、それは実際には問題ではありません。

ファイル マネージャーから取得したs は、「キーのプロパティ」リストにアイテムNSURLを含めている限り、それぞれが表すファイル システム オブジェクトがディレクトリであるかどうかを示します。NSURLIsDirectoryKey

取得した後にその情報を使用して、または他の回答が示すように列挙することによって、配列をフィルタリングする方法はいくつもあります。

次のアクセサ メソッドを追加できますNSURL

@implementation NSURL (RWIsDirectory)

- (BOOL)RWIsDirectory
{
    NSNumber * isDir;
    [self getResourceValue:&isDir forKey:NSURLIsDirectoryKey error:NULL];
    return [isDir boolValue];
}

@end

次に、述語を使用します。

[directoryContents filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"RWIsDirectory == NO"]];
于 2013-08-03T01:32:37.507 に答える