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

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

Жанры

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

Табл. 16.1. Наиболее распространенные файловые методы класса NSFileManager Метод Описание– (NSData *) contentsAtPath: path Читает данные из файла. -(BOOL) createFileAtPath: path contents: (BOOL) data attributes: attr Пишет данные (data) в файл -(BOOL) removeFileAtPath: path handler: handler Удаляет файл. -(BOOL) movePath: from toPath: to handler: handler Переименовывает или перемещает файл (to не может существовать заранее). -(BOOL) copyPath: from toPath: to handler: handler Копирует файл (to не может существовать заранее). -(BOOL) contentsEqualAtPath: path1 andPath: path2 Сравнивает содержимое двух файлов. -(BOOL) fileExistsAtPath: path Проверяет существование файла. -(BOOL) isReadableRleAtPath: path Проверяет, существует ли файл и доступен ли он для чтения. -(BOOL) isWritableFileAtPath: path Проверяет, существует

ли файл и доступен ли он для записи. -(NSOictionary *) fileAttributesAtPath: path traverseLink: (BOOL) flag Читает атрибуты файла. -(BOOL) changeFileAttributes: attr atPath: path Изменяет атрибуты

Каждый из этих файловых методов вызывается в объекте NSFileManager, который создается при отправке сообщения defauttManager этому классу. NSFileManager *fm; ... fm = [NSFileManager defaultManager];

Например, для удаления файла todolist из текущей папки нужно создать сна-чала объект класса NSFileManager, как показано выше, и затем вызвать метод removeFileAtPath:. [fm removeFileAtPath: @"todolist" handler: nil];

Возвращаемый результат можно проверить, чтобы убедиться, что удаление этого файла выполнено успешно. if ([fm removeFileAtPath: @"todolistn handler: nil] == NO) { NSLog (@"Couldn’t remove file todolist"); (Нельзя удалить файл todolist) return 1; }

Словарь атрибутов позволяет, в частности, указывать разрешения доступа к создаваемому файлу или получать либо изменять информацию для существую-щего файла. Разрешения по умолчанию задаются при создании файла с указанием значения nil в качестве этого параметра. Метод fileAttributesAtPadiitraverseUnk: возвращает словарь, содержащий атрибуты указанного файла. Параметр traverseLink: имеет значение YES или N0 для символических ссылок. Если файл задан символической ссылкой и указано значение YES, то возвращаются атрибуты файла привязки; если указано значение N0, то возвращаются атрибуты самой привязки (ссылки).

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

В программе 16.1 показаны основные операции с файлами. В этом примере предполагается, что в текущей папке есть файл testfile, содержащий следующие три строки текста. This is a test file with some data in it. (Это тестовый файл с некоторыми данными.) Here’s another line of data. (Это еще одна строка данных.) And a third. (И третья.) // Основные файловые операции // Предполагается, что существует файл "testfile" // в текущей рабочей папке #import <Foundation/NSObject.h> #import <Foundation/NSString.h> #import <Foundation/NSFileManager.h> #import <Foundation/N$AutoreleasePool.h> #import <Foundation/NSDictionary.h> int main (int argc, char *argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; NSString *fName = @"testfile"; NSFileManager *fm; NSDictionary *attr; // Нужно создать экземпляр filemanager fm = [NSFileManager defaultManager]; // Сначала проверим существование нашего тестового файла if ([fm fileExistsAtPath: fName] == NO) { NSLog (@"File doesn’t exist!"); (Файл не существует) return 1; } // Теперь создадим копию if ([fm copyPath: fName toPath: @"newfile" handler; nil] == NO) { NSLog (@"File copy failed!"); (Копирование файла не выполнено) return 2; } // Проверим эти два файла на идентичность if ([fm contentsEqualAtPath: fName andPath: @"newfile"] == NO) { NSLog (@"Files are not equal!"); (Файлы не равны) return 3; } // Теперь переименуем копию if {[fm movePath: @"newfile" toPath: @"newfile2" handler: nil] == NO) { NSLog (@"File rename failed!"); (Переименование файла не выполнено) return 4; } // Получим размер newfile2 if ((attr = [fm fileAttributesAtPath: @"newfile2" traverseLink: NO]) == nil) { NSLog (@"Couldn't get file attributes!"); (Невозможно получить атрибуты файла) return 5; } NSLog (@"File size is %i bytes", [[attr objectForKey: NSFileSize] intValue]); // И, наконец, удалим исходный файл if ([fm removeFileAtPath: fName handler; nil] == NO) { NSLog (@"File removal failed!"); (невозможно удалить файл) return 6; } NSLog (@"All operations were successful!"); // Вывод содержимого нового созданного файла NSLog(@"%@" [NSString stringWithContentsOfFile: @"newfile2" encoding: NSUTF8StringEncoding error: nil]); [pool drain]; return 0; }

Вывод программы 16.1 File size is 84 bytes (Размер

файла 84 байта) All operations were successful! (Все операции выполнены успешно) This is a test file with some data in it. (Это тестовый файл с некоторыми данными.) Here's another line of data. (Это еще одна строка данных.) And a third. (И третья.)

Программа сначала проверяет, существует ли файл testfile. Если да, то про-грамма создает его копию и затем проверяет эти файлы на совпадение. Опытные пользователи UNIX обратят внимание, что мы не можем переместить или копировать файл в определенную папку, просто указав эту целевую папку для методов copy Path: toPath: и movePath:toPath:; в этой папке должно быть явно указано имя файла.

Примечание. Мы можем создать testfile с помощью Xcode, выбрав New File... (создать файл) в меню File. В появившейся левой панели нужно выделить Other (Другое) и затем выбрать в правой панели Empty File (Пустой файл). Введите testfile как имя файла и убедитесь, что он создается в той же папке, что и выпол-няемый файл — в вашей папке проекта Build/Debug.

Метод movePath:toPath: можно использовать для перемещения файла из одной папки в другую. (Или для перемещения целой папки.) Если оба пути указывают на одну и ту же папку (как в нашем примере), то результатом будет переименование файла. Например, в программе 16.1 мы переименовываем файл newfile в newfile2.

Как указывалось в таблице 16.1, при выполнении операций копирования, переименования или перемещения указанный целевой файл (to) не может су-ществовать заранее, иначе операция не будет выполнена.

Размер файла newfile2 определяется с помощью метода fileAttributesAtPath:traverseUnk:. Мы проверяем, что возвращается непустой (не nil) словарь, и затем используем метод NSDictionary objectForKey: для получения из словаря размера файла с помощью ключа NSFileSize. Затем выводится целое значение из словаря.

Метод removeFileAtPath:handler: удаляет наш исходный файл testfile.

И, наконец, метод NSString stringWithContentsOfFile: читает содержимое файла newfile2 в строковый объект, который затем передается как аргумент в NSLog для вывода.

В программе 16.1 проверяется успешность выполнения каждой файловой операции. Если операция не выполнена, выводится сообщение об ошибке с помощью NSLog, и программа завершает работу, возвращая ненулевое значение состояния выхода. Каждое ненулевое значение, которое соответствует ошибке в программе, уникальным образом определяет тип ошибки. Если вы пишете средства, запускаемые из командной строки, это полезный способ, поскольку другая программа может проверять возвращаемое значение, например, из сце-нария оболочки. Работа с классом NSData

При работе с файлами часто требуется читать данные во временную область хранения в памяти, которую называют буфером (buffer). Буфер часто использу-ется при сборе данных для последующего вывода в файл. Класс Foundation NSData позволяет легко создавать буфер, читать в него содержимое файла или писать содержимое буфера в файл. Для 32-битного приложения в буфере NSDATA можно хранить до 2 Гб. В случае 64-битного приложения в таком буфере можно хранить до 8 Эб (экзабайт), то есть 8000 Гб информации!

Можно определять немутабельные (NSData) или мутабельные (NSMutableData) области памяти. Мы ознакомим вас с методами данного класса в этой главе, а также в последующих главах.

В программе 16.2 показано, как читать содержимое файла в буфер, опреде-ленный в памяти.

Эта программа читает содержимое файла newftle2 и записывает его в новый файл с именем newfile3. В некотором смысле это реализация операции копиро-вания файла, хотя и не столь простая, как метод copy Rath :to Path: handler:, // Создание копии файла #import <Foundation/NSObject.h> #import <Foundation/NSString.h> #import <Foundation/NSFileManager.h> #import <Foundation/NSAutoreteasePool.h> #import <Foundation/N5Data.h> int main (int arge, char *argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] initj; NSFileManager *fm; NSData *fileData; fm = [NSFileManager defaultManager]; // Чтение файла newfile2 fileData = [fm contentsAtPath: @"newfile2"]; if (fileData == nil) { NSLog (@"File read failed!"); return 1; } // Запись данных в newfile3 if ([fm createFileAtPath: @"newfile3" contents; fileData attributes: nil] == N0} { NSLog (@"Couldn’t create the copy!"); (Невозможно создать копию.) return 2; } NSLog (@"File copy was successful!"); (Копирование файла выполнено успешно) [pool drain]; return 0; }

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

Газлайтер. Том 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