FileManager — це клас з Foundation framework, що надає інтерфейс для роботи з файловою системою iOS, macOS та інших платформ Apple. Він дозволяє створювати, читати, переміщувати та видаляти файли й директорії, а також керувати метаданими та правами доступу. В iOS всі операції FileManager обмежені рамками Sandbox додатку. За даними Документації Apple для розробників (2026), FileManager є потокобезпечним і може використовуватися з фонових потоків, але всі операції з файловою системою повинні виконуватися з урахуванням пісочниці та прав доступу Security-Scoped Bookmarks.
Головне
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 для інформування про прогрес.
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 додаток має три основні директорії, доступні через 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 для потокового читання та запису великих файлів, який не завантажує весь файл в пам'ять.
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 та надає атрибути кожного елемента без додаткового запиту до файлової системи.
// Рекурсивний обхід директорій
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 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 можуть бути дорогими, особливо на пристроях з повільною flash-пам'яттю. Основні рекомендації Apple включають виконання всіх файлових операцій на фонових чергах, мінімізацію кількості викликів fileExistsAtPath та використання кешування результатів.
Метод fileExists виконує системний виклик stat(), який відносно повільний. Якщо ви перевіряєте наявність файлу перед його читанням, краще одразу спробувати прочитати його та обробити помилку — це виконує той самий stat, але позбавляє від подвійного системного виклику. Для масових перевірок використовуйте enumeratorAt з resourceValues.
Для оптимізації роботи з великими обсягами даних:
Apple Instruments надає шаблон File Activity для профілювання файлових операцій. Використовуйте його для виявлення вузьких місць — наприклад, частих викликів fileExists в циклі або операцій запису на main thread. Найчастіші проблеми продуктивності пов'язані з синхронним записом великих файлів при згортанні додатку.
Часті запитання
FileManager — клас Foundation framework для роботи з файловою системою Apple. Надає API для створення, читання, переміщення, видалення файлів та директорій. В iOS його робота обмежена рамками Sandbox додатку, за винятком Security-Scoped Bookmarks.
Documents — користувацькі дані з бекапом в iCloud. Library/Caches — кеші без бекапу. Library/Application Support — бази даних. tmp — тимчасові файли. App Group Container — для спільних даних між додатками однієї групи.
Викличте FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first. Метод повертає URL з абсолютним шляхом до директорії Documents всередині Sandbox поточного додатку. Для перевірки існування використовуйте fileExists(atPath:).
Ні, Sandbox iOS забороняє доступ до файлової системи інших додатків. Винятки: App Groups (спільна директорія для додатків одного розробника) та Security-Scoped Bookmarks (доступ до файлів через UIDocumentPicker та iCloud Drive).
Використовуйте опцію .atomic при записі — дані спочатку зберігаються в тимчасовий файл, потім атомарно переміщуються в цільовий шлях. Це запобігає пошкодженню файлу при збої запису. Для великих даних використовуйте FileHandle з записом чанками по 1-2 MB.
Підсумки
Ми розробимо мобільний застосунок під ключ
IT Sectr створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.
Читайте також