Чтение онлайн

ЖАНРЫ

iOS. Приемы программирования

Нахавандипур Вандад

Шрифт:

• attributes — словарь атрибутов, который можно передать системе. Эти атрибуты будут определять детали создания каталога. Здесь мы не будем использовать этот параметр, чтобы не усложнять пример. Но тут вы можете изменять такую информацию, как дата и время внесения изменений, дата и время создания, а также при желании и другие атрибуты созданного каталога;

• error — данный параметр принимает указатель на объект-ошибку типа NSObject. Этот объект будет заполняться любыми ошибками, которые могут возникать в процессе создания каталога. В принципе, целесообразно передавать объект-ошибку в этом параметре, так что, если он завершится неудачно (возвратит NO), вы сможете обратиться к ошибке и определить, что именно пошло не так.

См.

также

Раздел 12.1.

12.4. Перечисление файлов и каталогов

Постановка задачи

Вы хотите построить перечень подкаталогов, содержащихся в каталоге, либо построить список файлов, содержащихся в каталоге. Акт перечисления означает, что вы просто хотите найти все каталоги и/или файлы, расположенные внутри другого каталога.

Решение

Используйте метод экземпляра contentsOfDirectoryAtPath: error:, относящийся к классу NSFileManager, как показано далее. В данном примере мы перечисляем все файлы, каталоги и символьные ссылки, расположенные в каталоге пакета с приложением:

— (BOOL) application:(UIApplication *)application

didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{

NSFileManager *fileManager = [[NSFileManager alloc] init];

NSString *bundleDir = [[NSBundle mainBundle] bundlePath];

NSError *error = nil;

NSArray *bundleContents = [fileManager

contentsOfDirectoryAtPath: bundleDir

error:&error];

if ([bundleContents count] > 0 &&

error == nil){

NSLog(@"Contents of the app bundle = %@", bundleContents);

}

else if ([bundleContents count] == 0 &&

error == nil){

NSLog(@"Call the police! The app bundle is empty.");

}

else {

NSLog(@"An error happened = %@", error);

}

self.window = [[UIWindow alloc]

initWithFrame: [[UIScreen mainScreen] bounds]];

// Точка переопределения для дополнительной настройки после запуска приложения

self.window.backgroundColor = [UIColor whiteColor];

[self.window makeKeyAndVisible];

return YES;

}

Обсуждение

В некоторых приложениях для iOS иногда требуется строить перечень содержимого каталога. Возможно, вы пока не вполне понимаете, зачем это может понадобиться, поэтому рассмотрим соответствующий пример. Допустим, пользователь хочет скачать из Интернета 10 изображений и кэшировать их в вашем приложении. Вы выполняете эту операцию и сохраняете их, допустим, в каталоге tmp/images/, который создали вручную. Затем пользователь закрывает ваше приложение и вновь открывает его, а вы хотите отобразить в пользовательском интерфейсе вашей программы список уже загруженных файлов-изображений (в табличном

виде). Как это сделать? Ничего сложного. Вам всего лишь потребуется перечислить содержимое вышеупомянутого каталога с помощью класса NSFileManager. Как было показано в подразделе «Решение» данного раздела, метод экземпляра contentsOfDirectoryAtPath: error:, относящийся к классу NSFileManager, возвращает массив объектов NSString, которые и соответствуют файлам, подкаталогам и символьным ссылкам внутри заданного каталога. Тем не менее непросто определить, какой из этих объектов является файлом, какой — подкаталогом и т. д. Чтобы получить от файлового менеджера более детализированную информацию, вызовите метод contentsOfDirec toryAtURL: includingPropertiesForKeys: options: error:. Рассмотрим параметры, которые можно передавать этому методу.

• contentsOfDirectoryAtURL — путь к каталогу, который вы хотите просмотреть. Этот путь должен предоставляться как экземпляр NSURL. Не волнуйтесь, если не знаете, как построить этот экземпляр. Вскоре мы об этом поговорим.

• includingPropertiesForKeys — это массив свойств, которые система iOS должна выбирать для каждого файла, каталога или элемента, найденного в конкретной директории. Например, вы можете указать, что в результатах должна возвращаться дата создания каждого элемента. Эта информация должна возвращаться в составе приходящего к вам экземпляра URL (или в экземплярах NSURL, получаемых от фреймворка). Вот список некоторых наиболее важных значений, которые могут находиться в этом массиве:

• NSURLIsDirectoryKey — позволяет постфактум определить, указывает ли один из возвращенных URL на каталог;

• NSURLIsReadableKey — возвращает дату создания того элемента, который расположен по возвращенному URL;

• NSURLContentAccessDateKey — в возвращаемых результатах передает дату последнего обращения к содержимому;

• NSURLContentModificationDateKey — как понятно из названия, это значение позволяет определять дату последнего изменения информации, расположенной по возвращенному URL.

• options — для этого параметра можно передать только одно из двух значений: 0 или NSDirectoryEnumerationSkipsHiddenFiles. Если введено второе значение, то, как понятно из его названия, при построении перечня будут пропущены все скрытые элементы.

• error — ссылка на объект, в который будет записываться информация об ошибке, если методу не удастся выполнить стоящую перед ним задачу. Обычно целесообразно передавать этому методу объекты-ошибки, если есть такая возможность. Если какие-то ошибки и будут возникать, то такие объекты помогут вам более уверенно с ними справляться.

Теперь, когда мы значительно более полно контролируем перечисление элементов, построим перечень всех элементов из каталога. app и выведем даты создания, последнего изменения элемента и последнего обращения к нему. Кроме того, будем выводить информацию о том, является ли этот элемент скрытым, а также есть ли у нас право считывания конкретного файла. Наконец, мы также укажем, являются конкретные элементы каталогами или нет. Приступим:

— (NSArray *) contentsOfAppBundle{

NSFileManager *manager = [[NSFileManager alloc] init];

NSURL *bundleDir = [[NSBundle mainBundle] bundleURL];

NSArray *propertiesToGet = @[

NSURLIsDirectoryKey,

NSURLIsReadableKey,

NSURLCreationDateKey,

NSURLContentAccessDateKey,

NSURLContentModificationDateKey

];

NSError *error = nil;

Поделиться с друзьями: