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