Получение файлов (и их атрибутов) в каталоге - PullRequest
6 голосов
/ 05 июля 2011

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

NSFileManager *fm = [NSFileManager defaultManager];
NSURL *directoryURL = [NSURL fileURLWithPath:@"/Users/nacho4d/Desktop/"];
NSArray *urls = [fm contentsOfDirectoryAtURL:directoryURL 
                      includingPropertiesForKeys:[NSArray arrayWithObjects:NSURLNameKey, NSURLIsDirectoryKey, NSURLContentModificationDateKey, nil] 
                                         options:NSDirectoryEnumerationSkipsHiddenFiles 
                                           error:nil];
NSError *error = nil;
NSString *name;
NSDate *modificationDate;
NSNumber *isDirectory;
for (NSURL *url in urls) {
    if (![url getResourceValue:&name forKey:NSURLNameKey error:&error]) {
        NSLog(@"name: %@", [error localizedDescription]);error = nil;
    }
    if (![url getResourceValue:&modificationDate forKey:NSURLContentModificationDateKey error:&error]) {
        NSLog(@"modificationDate: %@", [error localizedDescription]); error = nil;
    }
    if (![url getResourceValue:&isDirectory forKey:NSURLIsDirectoryKey error:&error]) {
        NSLog(@"isDirectory: %@", [error localizedDescription]); error = nil;
    }
    NSLog(@"%@ %@ %@", name, modificationDate, isDirectory);
}

Однако я всегда получаю (null) (null) (null), без ошибок, но без данных; (

Интересно, что здесь не так?

PS: я знаю о contentsOfDirectoryAtPath:error: и attributesOfItemAtPath:error:, но я думаю, что это не лучший способ сделать это, не так ли? Я планирую использовать это в папках, которые могут содержать большое количество файлов, поэтому я хотел бы сделать это наиболее эффективным способом.

Редактировать для iOS5 и новее

Как указал @jeremyP, Согласно документам метод не реализован в iOS4, но, начиная с iOS5 и более поздних версий, он, похоже, работает правильно:

Наличие
Доступный в iOS 5.0 и позже. (Символ присутствует в iOS 4, но не выполняет никаких операций.)

Этот вопрос был сделан, когда iOS4 был последним, я думаю. Теперь в iOS 5 и 6 все работает как положено:)

1 Ответ

7 голосов
/ 05 июля 2011

Это не ответ на ваш вопрос, но ваша проверка ошибок должна выглядеть следующим образом:

if (![url getResourceValue:&name forKey:NSURLNameKey error:&error])
{
    NSLog(@"name: %@", [error localizedDescription]);error = nil;
}

Редактировать

Не могу понять, в чем проблема, но просто перечитал документацию по методу . В обсуждаемом важном предложении говорится:

Этот метод не реализован в iOS, поэтому он не выполняет никаких операций.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...