Знакомимся с файл-менеджером.

Если вы нашли опечатку в тексте, выделите ее и нажмите CTRL + ENTER.

Когда iOS приложение устанавливается на каком-то устройстве, создается структура папок, в том числе tmp каталог для хранения временных данных. В этом уроке мы научимся управлять файлами в этом tmp каталоге, а именно создавать их, читать и удалять. Этот туториал написан на iOS 9.1 и Xcode 7.1.

Откройте Xcode и создайте Single View Application. Назовите проект SwiftFileManager. Заполните название вашей организации, идентификатор организации. Выберете языком программирования Swift  и убедитесь, что в устройствах выбран iPhone.

Перейдите в Storyboard и перетащите четыре кнопки в столбик на главный экран, растяните их по ширине экрана.

Задайте произвольные цвета фону и тексту внутри кнопок.

 Дайте кнопкам следующие названия:

  • Создать файл
  • Прочитать файл
  • Удалить файл
  • Посмотреть директорию

 В итоге у вас должно получиться что-то вроде этого:

Теперь выделите все элементы и пройдите во вкладку "Resolve Auto Layout Issues" в правом нижнем углу (первая кнопка справа) и выберите пункт Add Missing Constraints (Добавить отсутствующие ограничения)

После того как вы это сделали вам нужно избавиться от одного ограничения, так как он портит вам внешний вид приложения. не верите? Запустите ваш проект!

Все, что вам нужно сделать, так это убрать одно ограничение и добавить другое. Выделите самый нижнее ограничение и удалите его:

Теперь у нас появилась рамка вокруг нашей кнопки. Давайте сделаем так, чтобы высота этой кнопки совпадала с высотой предыдущей кнопки?

Зажав Ctrl перетаскиваем от кнопки "Посмотреть директорию" на "Удалить файл" и отпускаем. Здесь нам нужно выбрать ограничение типа "Equal Heights". 

Теперь, если вы перезапустите проект, он у вас будет выглядеть хорошо.

Теперь давайте соединим наш код со сторибордом. Нажмите на кнопку Assistant Editor и убедитесь, что в правой части располагается файл ViewController.swift. Нажмите Ctrl и перетащите из кнопки "Создать файл" в класс ViewController и создайте следующий IBAction

Нажмите Ctrl и перетащите из "Посмотреть директорию"  кнопку в класс ViewController и создайте такой IBAction.

Аналогично проделаем процедуру с двумя оставшимися кнопками:

Перейдите в файл ViewController.swift и добавьте три свойства для класса ViewController

let fileManager = NSFileManager()
    let tempDir = NSTemporaryDirectory()
    let fileName = "file.txt"
  • Класс NSFileManager позволяет исследовать содержимое файловой системы и вносить в нее изменения
  • NSTemporaryDirectory является временным каталогом текущего пользователя
  • Файл с именем "text.txt" будет использоваться для этого туториала

Перед IBAction будет реализован вспомогательный метод checkDirectory(), который будет использоваться для проверки файлов внутри каталога:

func checkDirectory() -> String? {
        do {
            let filesInDirectory = try fileManager.contentsOfDirectoryAtPath(tempDir)
            
            let files = filesInDirectory
            if files.count > 0 {
                if files.first == fileName {
                    print("file.txt found")
                    return files.first
                } else {
                    print("File not found")
                    return nil
                }
            }
        } catch let error as NSError {
            print(error)
        }
        return nil
    }

Все файлы внутри временного каталога будут помещены в массив типа String, и этот массив будет проверяться на наличие нашего file.txt файла. Если проверка пройдет успешно, то имя файла будет возвращено, если нет - то будет возвращен nil. Далее, реализуем метод createFileBtnPressed().

@IBAction func createFileBtnPressed(sender: AnyObject) {
        
        let path = (tempDir as NSString).stringByAppendingPathComponent(fileName)
        let contentsOfFile = "Some Text Here"
        
        // Записываем в файл
        do {
            try contentsOfFile.writeToFile(path, atomically: true, encoding: NSUTF8StringEncoding)
            print("File text.txt created at temp directory")
        } catch let error as NSError {
            print("could't create file text.txt because of error: \(error)")
        }
    }

Файл text.txt создается с контентом "Some Text Here"  и записывается в каталог tempDir/ с методом writeToFile:atomically:encoding. Если у нас не получается с вами создать файл, то в консоль выводится ошибка.

Далее, реализуем метод viewDirectoryBtnPressed():

@IBAction func viewDirectoryBtnPressed(sender: AnyObject) {
        // Смотрим содержимое папки
        let directoryWithFiles = checkDirectory() ?? "Empty"
        print("Contents of Directory =  \(directoryWithFiles)")
    }

Мы проверяем наличие файла file.txt в каталоге через метод checkDirectory(), если у нас есть этот файл, то в directoryWithFiles присваивается возвращаемое значение метода checkDirectory(), если же файла у нас не оказывается, то в directoryWithFiles присваивается строка "Empty" .  Оператор ??  это коалесцирующий nil оператор (или оператор объединяющий по nil),  работает он таким образом, что когда checkDirectory() будет равен nil, то directoryWithFiles будет равен "Empty" , если же  checkDirectory() не будет равен nil (то есть "file.txt" есть), то  в directoryWithFiles перейдет название файла "file.txt". Значение directoryWithFiles будет выведено в консоль.

Далее, реализуем метод readFileBtnPressed():

@IBAction func readFileBtnPressed(sender: AnyObject) {
        
        // Читаем 
        let directoryWithFiles = checkDirectory() ?? "Empty"
        
        let path = (tempDir as NSString).stringByAppendingPathComponent(directoryWithFiles)
        
        do {
            let contentsOfFile = try NSString(contentsOfFile: path, encoding: NSUTF8StringEncoding)
            print("content of the file is: \(contentsOfFile)")
        } catch let error as NSError {
            print("there is an file reading error: \(error)")
        }
    }

Метод contentsOfFile:encoding помещает содержание файла в NSString. Если файл присутствует, то его содержимое будет выведено в консоль, в противном случае появится сообщение "there is an file reading error:".

Наконец, реализуем метод deleteFileBtnPressed():

@IBAction func deleteFileBtnPressed(sender: AnyObject) {
        
        let directoryWithFiles = checkDirectory() ?? "Empty"
        do {
            let path = (tempDir as NSString).stringByAppendingPathComponent(directoryWithFiles)
            try fileManager.removeItemAtPath(path)
            print("file deleted")
        } catch let error as NSError {
            print("error occured while deleting file: \(error.localizedDescription)")
        }
    }

Метод removeItemAtPath() удалит файл, если он есть. Запустите проект, выберете кнопки и посмотрите на консоль, чтобы увидеть результаты наших действий.

Урок подготовил: Акулов Иван