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

ЖАНРЫ

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

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

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

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