Разработка под Мак. Часть 5. Работа с файлами

Jul 11, 2012 19:10



В этой части  - как прочитать содержимое каталога и отличить каталог от файла.


Код

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

Код будем писать не с нуля, а сделаем форк бранча filedialog из предыдущей части.

В файл AppDelegate.m, после строк

---- код ----

// Список выбранных файлов
        NSArray *files = [openDlg URLs];---- код ----

добавим следующий код:

---- код ----

// Обрабатываем список
        for(NSURL *url in files) {
            NSLog(@"%@", url);

// Берем из URL только путь к файлу
            NSString *path = [url path];

// Объект файл-менеджера
            NSFileManager *fileManager = [[NSFileManager alloc] init];
            // Флаг каталога
            BOOL isDir;

// Если файл является каталогом
            if ([fileManager fileExistsAtPath:path isDirectory:&isDir] && isDir) {
                NSLog(@"dir: %@", path);

//Читаем содержимое каталога
                NSArray * dir = [fileManager contentsOfDirectoryAtPath:path error:nil];

// Вывод содержимого каталога
                for (NSArray *d in dir) {
                    NSLog(@"%@", d);
                }
            }
            // Если файл является файлом
            else {
                NSLog(@"file: %@", path);
            }
        }---- код ----

Кстати, в бранче filedialog дальше шли три строчки кода, выводящие уведомление. В этом бранче вывод будет происходить в лог, так что эти строчки можно удалить.

Теперь разберемся, что здесь происходит.

Обработка списка URL

Вот эта конструкция

---- код ----
for(NSURL *url in files)
---- код ----

- это специальная форма записи цикла для обработки списков. В языке Перл, к примеру, эта форма цикла называется "foreach". При такой записи цикл делает столько итераций, сколько значений имеется в массиве. На каждой итерации очередное значение из массива присваивается некоторой переменной, с которой потом что-то можно делать.

Ключевым словом в этой конструкции является оператор "in".

Мы обрабатываем массив "files". В нем у нас находятся строки - пути к выбранным файлам. Каждую строку мы поочередно присваиваем переменной "url".

Но тут есть тонкость - диалог выбора файлов возвращает не просто пути к файлам, а URLs - более общую форму адресации. Сравните:

file://localhost/Users/test.txt - это URL файла test.txt
/Users/test.txt - это путь к файлу test.txt

В массиве "files" у нас URL, а не просто строки с путями, поэтому переменная "url" должна иметь тип NSURL, а не просто NSString.

Далее из URL нам нужно будет извлечь часть, которая, собственно, и является путем к файлу в файловой системе. Для этого нужно воспользоваться методом "path" класса NSURL.

---- код ----

// Берем из URL только путь к файлу
NSString *path = [url path];---- код ----

Вот теперь у нас есть обычная строка с путем к файлу.

Работа с файлами

Для работы с файлами имеется класс NSFileManager. Нас интересуют два метода этого класса.

Первый метод - "fileExistsAtPath". Этот метод проверяет, существует ли указанный файл. Но нам нужно не просто проверить существование файла, а еще узнать, не является ли этот файл каталогом. Для этого нужно передать методу второй параметр, "isDirectory".

Если файл действительно окажется каталогом, то переменная, переданная в этом параметре, будет установлена в значение "TRUE". Ну, а если переменная станет истинной, то условие проверки выполнится и будет выполнен код, предназначенный для работы с каталогом.

В противном случае - файл является именно файлом, условие не выполняется и управление передается коду, работающему с файлами.

Второй метод - "contentsOfDirectoryAtPath". Этот метод читает содержимое каталога и возвращает массив с именами встретившихся файлов. Обратите внимание - метод не возвращает файлы "." и ".." (впрочем, не особо они и нужны).

Репозиторий, бранч readdir

Часть 4. Диалог открытия файлов
Часть 6. Создание своего класса

mac, разработка

Previous post Next post
Up