NSFileManager список содержимого каталога исключая каталоги


Можно ли указать методу -[NSFileManager contentsOfDirectoryAtURL:includingPropertiesForKeys:options:error:], чтобы он исключал имена каталогов при сборе содержимого каталога?

У меня есть древовидное представление, показывающее папки, и я хочу показать только файлы в табличном представлении, но я не могу найти ключ или какой-либо другой способ исключить папки. Я предполагаю, что я мог бы повторить возвращенный массив, чтобы поместить только файлы во второй массив, который будет использоваться в качестве источника данных, но эта двойная обработка кажется немного сомнительной.

Я также попытался вернуться nil из Метод tableView:viewForTableColumn:row:, если NSURL был каталогом, но это приводит только к пустой строке в таблице, так что это тоже не годится.

Наверняка есть способ просто сказать NSFileManager, что мне нужны только файлы?

3 4

3 ответа:

Вы можете пойти немного глубже с перечислителем каталогов.

Как насчет этого?

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

Лучше всего использовать 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 объектов, представляющих файлы.

Нет никакого способа получить содержимое, включая каталоги, а затем вырезать их оттуда, но это на самом деле не проблема.

S, который вы получаете из файлового менеджера, сообщит вам, является ли объект файловой системы каталогом, если вы включаете элемент 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"]];