FileManager — що це, робота з файловою системою iOS

Автор: IT Sectr Опубліковано: 2026-07-09 Час читання: 9 хв

FileManager — це клас з Foundation framework, що надає інтерфейс для роботи з файловою системою iOS, macOS та інших платформ Apple. Він дозволяє створювати, читати, переміщувати та видаляти файли й директорії, а також керувати метаданими та правами доступу. В iOS всі операції FileManager обмежені рамками Sandbox додатку. За даними Документації Apple для розробників (2026), FileManager є потокобезпечним і може використовуватися з фонових потоків, але всі операції з файловою системою повинні виконуватися з урахуванням пісочниці та прав доступу Security-Scoped Bookmarks.

Головне

  • FileManager — основний клас Foundation для операцій з файловою системою: читання, запис, переміщення, видалення файлів.
  • Sandbox обмежує доступ FileManager лише директоріями додатку — Documents, Library, tmp та App Group.
  • URL-based API (fileManager.urls) є кращим за String-based (NSHomeDirectory) для сучасних додатків.
  • FileManagerDelegate дозволяє відстежувати та контролювати файлові операції через shouldMoveItemAt та shouldRemoveItemAt.
  • iCloud Drive доступний через FileManager при увімкненому ubiquityContainer та відповідних entitlements.

Що таке FileManager

FileManager — це сінглтон-клас з Foundation framework, що надає уніфікований API для взаємодії з файловою системою на всіх платформах Apple. Доступний через FileManager.default або через створення екземпляра з кастомним делегатом.

Основні можливості класу включають: перевірку існування файлу (fileExists), створення директорій (createDirectory), копіювання та переміщення (copyItem, moveItem), видалення (removeItem), отримання атрибутів (attributesOfItem) та вмісту директорій (contentsOfDirectory). FileManager тісно пов'язаний з NSData, String та JSONEncoder/Decoder для серіалізації даних.

FileManager є потокобезпечним: Apple гарантує безпеку виклику методів з різних потоків. Однак операції з файловою системою можуть бути повільними на великих файлах, тому Apple рекомендує виконувати їх на фоновій черзі (DispatchQueue.global) та викликати методи FileManagerDelegate для інформування про прогрес.

swift
let fileManager = FileManager.default
let documentsURL = fileManager.urls(
    for: .documentDirectory,
    in: .userDomainMask
).first!

let fileURL = documentsURL.appendingPathComponent("data.plist")

if fileManager.fileExists(atPath: fileURL.path) {
    print("File exists at \(fileURL.path)")
}

Основні директорії iOS додатку

Кожен iOS додаток має три основні директорії, доступні через FileManager в рамках Sandbox: Documents, Library та tmp. Кожна має своє призначення та правила резервного копіювання, які важливо дотримуватися для проходження рев'ю в App Store.

Documents — для користувацьких даних, які повинні зберігатися між запусками та бекапитися в iCloud. Library — для файлів додатку: кешів (Caches), налаштувань (Preferences), баз даних (Application Support). tmp — для тимчасових файлів, які можуть бути видалені системою в будь-який момент між запусками додатку.

ДиректоріяFileManager URLБекапВикористання
Documents.documentDirectoryТакКористувацькі дані, файли, експорт
Library/Caches.cachesDirectoryНіКеші зображень, тимчасові дані
Library/Preferences.libraryDirectory + "Preferences"ТакUserDefaults, налаштування додатку
Library/Application Support.applicationSupportDirectoryТакБази даних, CoreData, Realm
tmp.tmpDirectory (NSTemporaryDirectory)НіТимчасові файли сесії

Правило Apple: якщо файл можна відновити з інтернету або перестворити — він повинен зберігатися в Caches (без бекапу). Якщо файл містить користувацькі дані — Documents (з бекапом). Неправильне розміщення файлів — одна з частих причин відхилення додатку, оскільки Apple перевіряє використання Storage та iCloud Backup Guidelines.

Читання та запис файлів

FileManager сам не надає методів для читання вмісту файлів — для цього використовуються NSData(contentsOf), String(contentsOf) або методи FileHandle. FileManager відповідає за управління файлами: перевірку існування, переміщення, копіювання, видалення.

Для запису даних використовується метод createFile(atPath:contents:attributes:) або високорівневі API — data.write(to:), JSONEncoder.encode та PropertyListEncoder. FileManager також надає FileHandle для потокового читання та запису великих файлів, який не завантажує весь файл в пам'ять.

swift
struct UserSettings: Codable {
    let username: String
    let isDarkMode: Bool
    let fontSize: Int
}

let settings = UserSettings(
    username: "developer",
    isDarkMode: true,
    fontSize: 16
)

// Записати JSON у Documents
let encoder = JSONEncoder()
encoder.outputFormatting = .prettyPrinted
let data = try encoder.encode(settings)
let url = documentsURL.appendingPathComponent("settings.json")
try data.write(to: url, options: .atomic)

// Читати JSON
let loadedData = try Data(contentsOf: url)
let loadedSettings = try JSONDecoder()
    .decode(UserSettings.self, from: loadedData)

При записі використовуйте options: .atomic — це гарантує, що файл не буде пошкоджено при збої запису: дані спочатку зберігаються в тимчасовий файл, а потім атомарно переміщуються в цільовий шлях. Для читання великих файлів використовуйте FileHandle з .readingMode та читайте дані чанками, контролюючи споживання пам'яті.

Управління директоріями

FileManager надає методи для повного управління директоріями: createDirectory (створення всіх проміжних папок через withIntermediateDirectories), contentsOfDirectory (отримання списку файлів), enumeratorAt (рекурсивний обхід) та subpathsOfDirectory (всі шляхи всередині директорії).

Метод enumeratorAt повертає DirectoryEnumerator, який дозволяє ефективно обходити великі директорії без завантаження всього вмісту в пам'ять. Він підтримує фільтрацію через skipDescendants та надає атрибути кожного елемента без додаткового запиту до файлової системи.

swift
// Рекурсивний обхід директорій
if let enumerator = fileManager.enumerator(
    at: documentsURL,
    includingPropertiesForKeys: [.fileSizeKey, .isDirectoryKey]
) {
    for case let fileURL as URL in enumerator {
        let attrs = try fileURL.resourceValues(
            for: [.fileSizeKey, .isDirectoryKey]
        )
        if attrs.isDirectory == false {
            let size = attrs.fileSize ?? 0
            print("File: \(fileURL.lastPathComponent), Size: \(size) bytes")
        }
    }
}

Для видалення директорії використовуйте removeItem(at:). Увага: видалення директорії в iOS незворотне — файли не потрапляють до кошика, як на macOS. Перед видаленням переконайтеся, що ви більше не використовуєте файли з цієї директорії, та виконайте операцію на фоновому потоці, оскільки видалення великої кількості файлів може заблокувати UI.

FileManager та iCloud

FileManager інтегрується з iCloud Drive через метод URLForUbiquityContainerIdentifier, який повертає URL директорії iCloud для додатку. Для роботи потрібно увімкнути iCloud capability в проекті та додати відповідний entitlement.

Файли iCloud синхронізуються автоматично, але FileManager надає методи для ручного контролю: startDownloadingUbiquitousItem примусово починає завантаження, evictUbiquitousItem видаляє локальну копію, а urlOfItem(at:) повертає локальний URL для файлу iCloud. NSMetadataQuery використовується для пошуку файлів в iCloud.

Критичне обмеження: iCloud Drive не підтримується для файлів в директорії Documents — лише для файлів в ubiquityContainer. Не намагайтеся синхронізувати Documents через iCloud; для цього використовуйте NSUbiquitousKeyValueStore для невеликих обсягів даних або Core Data з CloudKit для складних структур.

Продуктивність FileManager

Операції з FileManager можуть бути дорогими, особливо на пристроях з повільною flash-пам'яттю. Основні рекомендації Apple включають виконання всіх файлових операцій на фонових чергах, мінімізацію кількості викликів fileExistsAtPath та використання кешування результатів.

Метод fileExists виконує системний виклик stat(), який відносно повільний. Якщо ви перевіряєте наявність файлу перед його читанням, краще одразу спробувати прочитати його та обробити помилку — це виконує той самий stat, але позбавляє від подвійного системного виклику. Для масових перевірок використовуйте enumeratorAt з resourceValues.

Для оптимізації роботи з великими обсягами даних:

  • Використовуйте FileHandle для потокової обробки великих файлів
  • Кешуйте результати fileManager.urls для часто використовуваних директорій
  • Виконуйте пакетні операції в гранулярній черзі, уникаючи блокування main thread
  • Використовуйте CoordinatedFileManager для безпечного доступу з кількох потоків

Apple Instruments надає шаблон File Activity для профілювання файлових операцій. Використовуйте його для виявлення вузьких місць — наприклад, частих викликів fileExists в циклі або операцій запису на main thread. Найчастіші проблеми продуктивності пов'язані з синхронним записом великих файлів при згортанні додатку.

Часті запитання

Що таке FileManager в iOS?

FileManager — клас Foundation framework для роботи з файловою системою Apple. Надає API для створення, читання, переміщення, видалення файлів та директорій. В iOS його робота обмежена рамками Sandbox додатку, за винятком Security-Scoped Bookmarks.

Які директорії доступні через FileManager в iOS?

Documents — користувацькі дані з бекапом в iCloud. Library/Caches — кеші без бекапу. Library/Application Support — бази даних. tmp — тимчасові файли. App Group Container — для спільних даних між додатками однієї групи.

Як отримати шлях до Documents через FileManager?

Викличте FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first. Метод повертає URL з абсолютним шляхом до директорії Documents всередині Sandbox поточного додатку. Для перевірки існування використовуйте fileExists(atPath:).

Чи можна отримати доступ до файлів інших додатків через FileManager?

Ні, Sandbox iOS забороняє доступ до файлової системи інших додатків. Винятки: App Groups (спільна директорія для додатків одного розробника) та Security-Scoped Bookmarks (доступ до файлів через UIDocumentPicker та iCloud Drive).

Як безпечно записувати файли через FileManager?

Використовуйте опцію .atomic при записі — дані спочатку зберігаються в тимчасовий файл, потім атомарно переміщуються в цільовий шлях. Це запобігає пошкодженню файлу при збої запису. Для великих даних використовуйте FileHandle з записом чанками по 1-2 MB.

Підсумки

  • FileManager — центральний клас Foundation для всіх операцій з файловою системою в iOS: від перевірки існування до рекурсивного обходу директорій.
  • Documents, Library, tmp — три основні директорії додатку з різними правилами бекапу та життєвого циклу.
  • URL-based API є кращим за String-based шляхи для сумісності з Sandbox та Security-Scoped Bookmarks.
  • FileHandle та потокова обробка — єдиний спосіб роботи з великими файлами без переповнення пам'яті.
  • FileManagerDelegate дозволяє контролювати операції переміщення, копіювання та видалення через should-методи.
  • Інтеграція iCloud доступна через ubiquityContainer та NSMetadataQuery для роботи з хмарними файлами.
  • Продуктивність файлових операцій критична — виконуйте їх на фонових чергах та мінімізуйте виклики fileExists.

Ми розробимо мобільний застосунок під ключ

IT Sectr створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.

Обговорити проект

Читайте також