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

на главную - закладки

Жанры

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

Вывод программы 16.2 File copy was successful! (Копирование файла выполнено успешно)

Метод NSData contentsAtPath: просто принимает имя пути и читает содержимое указанного файла в область памяти (которую он создает). Метод возвращает в качестве результата объект области памяти или nil, если операцию чтения не удается выполнить (например, если этот файл не существует или недоступен для чтения).

Метод createRleAtPath:соntents:attributes: создает файл с указанными атрибутами (или использует атрибуты по умолчанию, если для аргумента атрибутов указано значение nil). Затем содержимое указанного объекта NSData записывается в файл. В нашем примере эта область памяти содержит данные прочитанного ранее файла. Работа с папками

В таблице 16.2 приводятся методы NSFileManager для работы с папками (катало-гами). Многие из этих методов аналогичны методам для обычных файлов из таблицы 16.1 (обозначения такие же, как в таблице 16.1).

Табл. 16.2.

Наиболее распространенные методы Метод Описание– (NSString *) currentDirectoryPath Получает текущую папку. -(BOOL) changeCurrentDirectoryPath: path Изменяет текущую папку. -(BOOL) copyPath: from toPath: to handler: handler Копирует структуру папки (to не может существовать заранее). -(BOOL) createDirectoryAtPath: path attributes: attr Создает новую папку. -(BOOL) fileExistsAtPath: path isDirectory: (BOOL *) flag Проверяет, содержится ли данный файл в папке (результат YES/NO сохраняется в переменной flag). -(NSArray *) directoryContentsAtPath: path Создает список содержимого папки. -(NSDirectoryEnumerator *) enumeratorAtPath: path Перечисляет содержимое папки. -(BOOL) removeFileAtPath: path handler: handler Удаляет пустую папку -(BOOL) movePath: from toPath: to handler: handler Переименовывает или перемещает папку (to не может существовать заранее).

В программе 16.3 показаны основные операции с папками. // Основные операции с папками #import <Foundation/NSObject.h> #import <Foundation/NSSIring.h> #import <Foundation/NSFileManager.h> #import <Foundation/NSAutoreleasePool.h> int main (int argc, char *argv[]) { NSAutoreleasePooi * pool = [[NSAutoreleasePool alloc] init]; NSString *dirName = @"testdir"; NSString *path; NSFileManager *fm; // Нужно создать экземпляр filemanager fm = [NSFileManager defaultManager]; // Получение текущей папки path = [fm currentDirectoryPath]; NSLog (@"Current directory path is %@", path); (Путь к текущей папке) // Создание новой папки if ([fm createDirectoryAtPath: dirName attributes: nil] == NO) { NSLog ((@"Couldn’t create directory!"); (Невозможно создать папку) return 1; } // Переименование новой папки if ((fm movePath: dirName toPath: @"newdir" handler: nil] == NO) { NSLog {@Directory rename failed!"); return 2; } // Смена папки на другую папку if ([fm changeCurrentDirectoryPath: @newdir"] == NO) { NSLog (@Change directory failed!"); (Невозможно сменить папку) return 3; } // Получение и вывод пути к текущей рабочей папке path = [fm currentDirectoryPath]; NSLog (@"Current directory path is %@", path); (Путь к текущей папке) NSLog (@"All operations were successful!"); (Все операции выполнены успешно) [pool drain]; return 0; }

Вывод программы 16.3 Current directory path is /Users/stevekochan/progs/ch16 (Путь к текущей папке) Current directory path is /Users/stevekochan/progs/ch16/newdir All operations were successful! (Все операции выполнены успешно)

Работу программы 16.3 легко понять из текста самой программы. Сначала мы получаем путь к текущей папке для информативных целей. Затем в текущей папке создается новая папка testdir. Затем в программе используется метод movePath:toPath:handler: для переименования этой новой папки из testdir в newdir. Помните, что этот метод позволяет также перемещать всю структуру папки (включая ее содержимое) из одного места файловой системы в другое.

После переименования новой папки программа делает эту новую папку те-кущей с помощью метода 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 в конце этой главы.) Это может произойти, если несколько пользователей выполнят вход в вашу систему и будут выполнять одно приложение.

Поделиться:
Популярные книги

Газлайтер. Том 17

Володин Григорий Григорьевич
17. История Телепата
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Газлайтер. Том 17

Вперед в прошлое 5

Ратманов Денис
5. Вперед в прошлое
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Вперед в прошлое 5

Курсант: назад в СССР 2

Дамиров Рафаэль
2. Курсант
Фантастика:
попаданцы
альтернативная история
6.33
рейтинг книги
Курсант: назад в СССР 2

Я Гордый Часть 3

Машуков Тимур
3. Стальные яйца
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я Гордый Часть 3

Чужая семья генерала драконов

Лунёва Мария
6. Генералы драконов
Фантастика:
фэнтези
5.00
рейтинг книги
Чужая семья генерала драконов

Первый среди равных. Книга VI

Бор Жорж
6. Первый среди Равных
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Первый среди равных. Книга VI

Кодекс Охотника. Книга XXII

Винокуров Юрий
22. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Кодекс Охотника. Книга XXII

Последний Паладин. Том 7

Саваровский Роман
7. Путь Паладина
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Последний Паладин. Том 7

Эммануэль

Арсан Эммануэль
1. Эммануэль
Любовные романы:
эро литература
7.38
рейтинг книги
Эммануэль

Двойник короля 18

Скабер Артемий
18. Двойник Короля
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Двойник короля 18

Наследник

Майерс Александр
3. Династия
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Наследник

Князь

Шмаков Алексей Семенович
5. Светлая Тьма
Фантастика:
юмористическое фэнтези
городское фэнтези
аниме
сказочная фантастика
5.00
рейтинг книги
Князь

Газлайтер. Том 10

Володин Григорий
10. История Телепата
Фантастика:
боевая фантастика
5.00
рейтинг книги
Газлайтер. Том 10

Наследие Маозари 6

Панежин Евгений
6. Наследие Маозари
Фантастика:
попаданцы
постапокалипсис
рпг
фэнтези
эпическая фантастика
5.00
рейтинг книги
Наследие Маозари 6