Программирование на Objective-C 2.0
Шрифт:
Метод lastPathComponent извлекает последний файл, указанный в пути. Это полезно, если нужно получить из абсолютного имени пути только базовое имя файла.
Метод stringВуАрреndingPathComponent: позволяет присоединять имя файла в конце пути. Если имя пути, указанное как получатель, не заканчивается символом «слэш», метод вставляет этот символ в имя пути, чтобы отделить его от присоединяемого имени файла. Сочетая метод currentDirectory с методом stringByAppendingPathComponent:, можно создавать полный путь к файлу в текущей папке. Этот способ показан в программе 16.5.
Метод pathExtension дает расширение имени файла для указанного имени пути. Например, расширением для имени файла path.m является т, и данный метод возвращает это расширение. Если имя файла не содержит расширения, то метод просто возвращает пустую строку.
Функция NSHomeDirectory возвращает домашнюю папку для текущего пользователя. Чтобы получить домашнюю
Метод 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) Возвращает путь к папке, которую можно использовать для создания временного файла.
Возможно, вам потребуется также функция Foundation NSSearchPathForDPrectorieslnDomains для обнаружения в системе специальных папок, таких как Application. Копирование файлов и использование класса NSProcessInfo
В программе 16.6 показано средство командной строки для реализации простой операции копирования файлов. Эта команда применяется следующим образом. copy from-file {bcfjlysq afqk) to-file (afqk-rjgbz)
В отличие от метода NSFileManager copyPath:toPath:handler:, это средство ко-мандной строки позволяет также использовать to-file как имя папки. Тогда эта папка копируется в папку to-file под именем from-file. Еще одно отличие от ука-занного метода: если to-file уже существует, его содержимое перезаписывается. Это в большей степени согласуется со стандартной командой копирования UNIX (ср).
Для получения имен файлов из командной строки можно использовать ар-гументы argc и argv, передаваемые в main. В качестве этих аргументов в команд-ной строке указываются, соответственно, целый ряд типов аргументов (включая имя команды)
Вместо обработки С-строк, что приходится делать при работе с argv, исполь-зуйте класс Foundation NSProcessinfo. NSProcessInfo содержит методы, позволяющие задавать и считывать различные типы информации о выполняемом приложении (то есть вашем процессе). Эти методы приводятся в таблице 16.5.
Табл. 16.5. Методы класса NSProcessinfo Метод Описание +(NSProcessInfo *) processlnfo Возвращает информацию о текущем процессе. -(NSArray *) arguments Возвращает аргументы для текущего процесса в виде массива объектов NSString. -(NSDictionary *) environment Возвращает словарь, состоящий из пар «переменная/значение», представляющих текущие переменные среды (например, PATH и НОМЕ) вместе с их значениями. -(int) processldentifier Возвращает идентификатор процесса, то есть уникальный номер, назначаемый операционной системой для идентификации каждого выполняемого процесса. -(NSString *) processName Возвращает имя текущего выполняемого процесса. -(NSString *) globallyllniqueString Возвращает при каждом вызове новую уникальную строку. Это можно использовать для генерации уникальных имен временных файлов (см. упражнение 5). -(NSString *) hostName Возвращает имя хост-системы (возвращает SteveKochans-Computer.local в моей системе Mac OS X). -(NSUInteger) operatingSystem Возвращает число, обозначающее операционную систему (возвращает значение 5 на моем Маке). -(NSString *) operatingSystemName Возвращает имя операционной системы (возвращает константу NSMACHOperatingSystem на моем Маке, где возможные возвращаемые значения определены в NSProcessInfo.h). -(NSString *) operatingSystemVersionString Возвращает текущую версию операционной системы (возвращает Version 10.5.4 (Build 9Е17) в моей системе Mac OS X). -(void) setProcessName: (NSString *) name Задает имя name для текущего процесса. Следует использовать с осторожностью, поскольку необходимо учитывать некоторые предположения об имени вашего процесса (например, в настройках пользователя по умолчанию). // Реализация простой утилиты копирования #import <Foundation/NSString.h> #import <Foundation/NSArray.h> #import <Foundation/NSFileManager.h> #import <Foundation/NSAutoreleasePool.h> #import <Foundation/NSPathUtilities.h> #import <Foundation/NSProcesslnfo.h> int main {int argc, char *argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; NSFileManager *fm; NSString *source, *dest; BOOL isDir; NSProcessInfo *proc = [NSProcessInfo processlnfo]; NSArray *args = [proc arguments]; fm = [NSFileManager defaultManager]; // Проверка того, что в командной строке заданы два аргумента if ([args count] != 3) { NSLog (@"Usage: %@ src dest", [proc processName]); return 1; } source = [args objectAtlndex: 1]; dest = [args objectAtlndex: 2]; // Проверка того, что исходный файл можно читать if ([fm isReadableFileAtPath: source] == NO) { NSLog (@"Can't read %@", source); return 2; } // Является ли целевой файл (dest) папкой? // Если да, то исходный файл (source) добавляется в конец целевого пути ffm fileExistsAtPath: dest isDirectory: &isDir); if (isDir == YES) dest = [dest stringByAppendingPathComponent: [source lastPathComponent]]; // Удаление целевого файла, если он уже существует [fm removeFileAtPath: dest handler: nil]; // Все сделано, можно выполнять копирование if ([fm copyPath: source toPath: dest handler: nil] == NO) { NSLog (@"Copy failed!"); return 3; } NSLog (@"Copy of %@ to %@ succeeded!", source, dest); [pool drain]; return 0; }
Вывод программы 16.6 $ Is -I смотрим, какие файлы у нас есть total 96 -rwxr-xr-x 1 stevekoc staff 19956 Jul 24 14:33 copy -rw-r~r~1 stevekoc staff 1484 Jul 24 14:32 copy.m -rw-r-r- 1 stevekoc staff 1403 Jul 24 13:00 filel.m drwxr-xr-x 2 stevekoc staff 68 Jul 24 14:40 newdir -ПАГ-Г-Г--1 stevekoc staff 1567 Jul 24 14:12 pathl.m -rw-r-r--1 stevekoc staff 84 Jul 24 13:22 testfile $ copy попытка команды без аргументов Usage: copy src dest (Использование: ...) $ copy foo copy2 Can’t read foo (Невозможно прочитать foo) $ copy copy.m backup.m Copy of copy.m to backup.m succeeded! (Копирование copy.m в backup.m выполнено!) $ diff copy.m backup.m сравнение файлов $ copy copy.m newdir попытка копирования в папку Copy of copy.m to newdir/copy.m succeeeded! (Копирование copy.m в newdir/copy.m выполнено!) $ Is -I newdir total 8 -rw-r-r- 1 stevekoc staff 1484 Jul 24 14:44 copy.m $
Метод NSProcessInfo arguments возвращает массив строковых объектов. Первый элемент этого массива — имя процесса, остальные элементы содержат аргументы, которые вводятся в командной строке.
Сначала проверяем, что в командной строке введено два ар^менга. Для этого проверяем размер массива args, возвращаемого методом arguments. Если проверка дает правильный результат, то программа затем извлекает имена исходного и целевого файлов из массива args, присваивая их значения переменным source и dest соответственно.