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

ЖАНРЫ

Программирование на Objective-C 2.0
Шрифт:

После переименования новой папки программа делает эту новую папку те-кущей с помощью метода changeCurrentDirectoryPath:. Затем выводится путь к текущей папке, чтобы убедиться, что изменение было выполнено успешно. Перечисление содержимого папки

Получил! список содержимого папки. Этот процесс можно осуществить с по-мощью метода enumeratorAtPath: или directoryContentsAtPath:. В первом случае каждый файл указанной папки перечисляется по отдельности, Если один из этих файлов является папкой, то по умолчанию его содержимое тоже рекурсивно перечисляется. Во время этого процесса мы можем динамически запрещать рекурсию (отправив сообщение skipDescendants объекту перечисления), чтобы содержимое папки не перечислялось.

В случае метода directoryContentsAtPath: выполняется перечисление указанной папки, и метод возвращает массив со списком. Если какой-либо из этих файлов является папкой, его содержимое не перечисляется данным методом. В программе 16.4 показано, как использовать каждый из

этих методов. // Перечисление содержимого папки #import <Foundation/NSString.h> #import <Foundation/NSFileManager.h> #import <Foundation/NSAutoreleasePool.h> #import <Foundation/NSArray.h> int main (int argc, char *argv[]) { NSAutoreteasePool * pool = [[NSAutoreleasePool alloc] initj; NSString *path; NSFileManager *fm; NSDirectoryEnumerator *dirEnum; NSArray *dirArray; // Создание экземпляра filemanager fm = [NSFileManager defaultManager]; // Получение пути к текущей рабочей папке path = [fm currentDirectoryPath]; // Перечисление содержимого папки dirEnum = [fm enumeratorAtPath: path]; NSLog (@"Contents of path"); (Содержимое папки) while ((path = [dirEnum nextObject]) != nil) NSLog (@"%@", path); // Еще один способ перечисления содержимого папки dirArray = [fm directoryContentsAtPath: [fm currentDirectoryPath]]; NSLog (@"Contents using directoryContentsAtPath:"); (Содержимое с помощью ...) for (path in dirArray) NSLog (@"%@", path); [pool drain]; return 0; }

Вывод программы 16.4 Contents of /Users/stevekochan/mysrc/ch16: (Содержимое папки) a.out dirl.m dir2.m filel .m newdir newdir/filel.m newdir/output pathl.m testfile Contents using directoryContentsAtPath: (Содержимое с помощью directoryContentsAtPath:) a.out dirl.m dir2.m filel.m newdir pathl.m testfile

Рассмотрим следующую последовательность кода. dirEnum = [fm enumeratorAtPath: path]; NSLog (@"Contents of path); while ((path = [dirEnum nextObject]) != nil) NSLog (@"%@", path);

Мы начинаем перечисление содержимого папки с отправки сообщения enumeratioaAtPatti: объекту filemanager, в данном случае — fm. Метод enumeratorAtPath: возвращает объект NSDirectortyEnumerator, который сохраняется в dirEnum. Теперь каждый раз при отправке сообщения nextObject этому объекту метод возвращает путь к следующему файлу в перечисляемой папке. Когда не остается файлов для перечисления, метод возвращает значение nil.

Из вывода программы 16.4 видно, чем отличаются эти методы. Метод enumeratorAtPath: создает список содержимого папки newdir, а метод directoryContentsAtPath: не создает. Если бы папка newdir содержала подпапки, то они тоже были бы перечислены методом enumeratorAtPath:.

Как говорилось выше, при выполнении цикла while в программе 16.4 вы могли бы запретить перечисление содержимого любых подпапок, внеся в код следующее изменение. while ((path = [dirEnum nextObject]) != nil) { NSLog (@"%@", path); [fm fileExistsAtPath: path isDirectory: &flag]; if (flag == YES) [dirEnum skipDescendents]; }

Здесь флаг представлен переменной типа BOOL. Метод fileExistsAtPath: сохраняет значение YES в этом флаге, если указанный путь содержится в папке, иначе сохраняется значение NO.

Вы можете вывести все содержимое dirArray с помощью одного вызова NSLog NSLog (@"%@", dirArray);

вместо быстрого перечисления, использованного в программе. Работа с путями: NSPathUtilities.h

В NSPathUtilities.h включены расширения функций и категорий к NSString для ра-боты с путями. Они позволяют сделать ваши программы более независимыми от структуры файловой системы и местонахождения конкретных файлов и папок. В программе 16.5 показано, как работать с функциями и методами из NS Path Utilities.h. // Основные операции с путями #import <Foundation/NSString.h> #import <Foundation/NSArray.h> #import <Foundation/NSFileManager.h> #import <Foundation/NSAutoreleasePool.h> #import <Foundation/NSPathUtilities.h> int main (int argc, char *argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; NSString *fName = @"path.m"; NSFileManager *fm; NSString *path, *tempdir, *extension, *homedir, *fullpath; NSString *upath = @"~stevekochan/progs/../ch16/./path.m"; NSArray *components; fm = [NSFileManager defaultManager]; // Получение временной рабочей папки tempdir = NSTemporaryDirectory ; NSLog (@"Temporary Directory is %@", tempdir); (Временная папка) // Извлечение базовой папки из текущей папки path = [fm currentDirectoryPath]; NSLog (@"Base dir is %@", [path lastPathComponent]); (Базовая папка) // Создание полного пути к файлу fName в текущей папке fullpath = [path stringByAppendingPathComponent: fName]; NSLog (@"fullpath to %@ is %@", fName, fullpath); (Полный путь к...) // Получение расширения имени файла extension = [fullpath path Extension]; NSLog (@"extension for %@ is %@", fullpath, extension); (Расширение имени для...) // Получение домашней папки пользователя homedir = NSHomeDirectory {); NSLog (@"Your home directory is %@", homedir); (Ваша домашняя папка ...) // Разбиение пути на его компоненты) components = [homedir pathComponents]; for ( path in components) NSLog (@"%@", path); // "Стандартизация" пути NSLog (@"%@" => upath, [upath stringByStandardizingPath] ); [pool drain]; return 0; }

Вывод программы 16.5 Temporary Directory is /var/folders/HT/HTyGLvSNHTuNb6NrMuo7QE+++TI/-Tmp-/ (Временная

папка) Base dir is examples (Базовя папка - examples) fullpath lo path.m is /Users/stevekochan/progs/examples/path.m (полный путь к ...) extension for /Users/stevekochan/progs/examples/path.m is m (расширение имени для ...) Your home directory is /Users/stevekochan (Ваша домашняя папка ...) / Users stevekochan -stevekochan/progs/../ch16/./path.m => /Users/stevekochan/chl 6/path.m

Функция NSTemporaryDirectory возвращает имя пути в системе для папки, в которой могут сохраняться временные файлы. Создавая временные файлы в этой папке, не забывайте удалять их по окончании использования. Кроме того, имена файлов должны быть уникальными, особенно в тех случаях, когда несколько экземпляров вашего приложения работает одновременно. (См. упражнение 5 в конце этой главы.) Это может произойти, если несколько пользователей выполнят вход в вашу систему и будут выполнять одно приложение.

Метод lastPathComponent извлекает последний файл, указанный в пути. Это полезно, если нужно получить из абсолютного имени пути только базовое имя файла.

Метод stringВуАрреndingPathComponent: позволяет присоединять имя файла в конце пути. Если имя пути, указанное как получатель, не заканчивается символом «слэш», метод вставляет этот символ в имя пути, чтобы отделить его от присоединяемого имени файла. Сочетая метод currentDirectory с методом stringByAppendingPathComponent:, можно создавать полный путь к файлу в текущей папке. Этот способ показан в программе 16.5.

Метод pathExtension дает расширение имени файла для указанного имени пути. Например, расширением для имени файла path.m является т, и данный метод возвращает это расширение. Если имя файла не содержит расширения, то метод просто возвращает пустую строку.

Функция NSHomeDirectory возвращает домашнюю папку для текущего пользователя. Чтобы получить домашнюю папку для определенного пользователя, можно использовать вместо этого функцию NSHomeDirectoryForUser, указав имя пользователя как аргумент для этой функции.

Метод pathComponents возвращает массив, содержащий каждый из компонентов указанного пути. В программе 16.5 последовательно извлекается каждый элемент возвращаемого массива, и каждый компонент отображается в отдельной строке вывода.

И, наконец, иногда имена пути содержат символы «тильда» (~), о чем мы уже говорили выше. Методы FileManager воспринимают - как сокращенное пред-ставление домашней папки пользователя, или -user для домашней папки ука-занного пользователя. Если ваши имена путей могут содержать символы «тиль-да», то раскрыть их позволяет метод stringByStandardizingPath. Этот метод возвращает путь в стандартизованном виде, то есть с удалением специальных символов. Метод stringByExpandingTildelnPatii раскрывает тол ько символ «тильда», если он присутствует в имени пути. Наиболее распространенные методы для работы с путями

В таблице 16.3 приводятся наиболее распространенные методы для работы с путями. В данной таблице components — это объект NSArray, содержащий строко-вые объекты для каждого компонента пути; path — это строковый объект, ука-зывающий путь к файлу; ext — это строковый объект, указывающий расширение имени файла (например, @"mp4"). Метод Описание +(NSStrirtg *) pathWittiComponents: components Создает допустимый путь из элементов components. -(NSArray *) pathComponents Разделяет путь на его составляющие компоненты. -(NSString *) lastPathComponent Извлекает последний компонент пути. -(NSString *) path Extension Извлекает расширение имени из последнего компонента пути. -(NSString *) stringByAppendingPathComponent: path Добавляет путь path в конец существующего пути. -(NSString *) stringByAppendingPathExtension: ext Добавляет расширение имени ext к последнему компоненту пути. -(NSString *) string ByDeletingLastPathComponent Удаляет последний компонент пути. -(NSString *) string ByDeleting LastPathComponent Удаляет последний компонент пути. -(NSString *) stringByDeletingPathExtension Удаляет расширение имени из последнего компонента пути. -(NSString *) stringByExpandingTildelnPath Раскрывает символы «тильда» в пути как домашнюю папку текущего пользователя (;) или домашнюю папку указанного пользователя (@@-user). -(NSString *) stringByResolvingSymlinksInPath Пытается разрешить (раскрыть) символические ссылки в пути. -(NSString *) stringByStandardizingPath Стандартизует путь, раскрывая - ..(родительская папка), .(текущая папка) и символические ссылки.

В таблице 16.4 представлены имеющиеся функции для получения информа-ции о пользователе, его домашней папке и его панке для хранения временных файлов.

Табл. 16.4. Наиболее распространенные функции для работы с путями Функция Описание NSString *NSUserName (void) Возвращает имя входа (login) текущего пользователя. NSString *NSFullUserName (void) Возвращает полное пользовательское имя текущего пользователя. NSString *NSHomeDirectory (void) Возвращает путь к домашней папке текущего пользователя. NSString NSHomeDirectoryForUser (NSString user) Возвращает домашнюю папку пользователя user. NSString *NSTemporaryDirectory(void) Возвращает путь к папке, которую можно использовать для создания временного файла.

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