FileManager — је класа из Foundation framework-а, која пружа интерфејс за рад са фајл системом iOS, macOS и других Apple платформи. Омогућава креирање, читање, премештање и брисање фајлова и директоријума, као и управљање метаподацима и правима приступа. У iOS-у све операције FileManager-а су ограничене оквирима Sandbox-а апликације. Према Apple Developer Documentation (2026), FileManager је thread-safe и може се користити из позадинских нити, али све операције са фајл системом морају се изводити узимајући у обзир sandbox и права приступа Security-Scoped Bookmarks.
Главне тачке
FileManager — синглтон класа из Foundation framework-а, која пружа унификовани API за интеракцију са фајл системом на свим Apple платформама. Доступан је кроз FileManager.default или креирањем инстанце са прилагођеним делегатом.
Главне могућности класе укључују: проверу постојања фајла (fileExists), креирање директоријума (createDirectory), копирање и премештање (copyItem, moveItem), брисање (removeItem), добијање атрибута (attributesOfItem) и садржаја директоријума (contentsOfDirectory). FileManager је уско повезан са NSData, String и JSONEncoder/Decoder за серијализацију података.
FileManager је thread-safe: 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 — за корисничке податке који треба да се чувају између покретања и да се backup-ују у iCloud. Library — за фајлове апликације: кешеве (Caches), подешавања (Preferences), базе података (Application Support). tmp — за привремене фајлове које систем може да обрише у било ком тренутку између покретања апликације.
| Директоријум | FileManager URL | Backup | Коришћење |
|---|---|---|---|
| Documents | .documentDirectory | Да | Кориснички подаци, фајлови, извоз |
| Library/Caches | .cachesDirectory | Не | Кешеви слика, привремени подаци |
| Library/Preferences | .libraryDirectory + "/Preferences" | Да | UserDefaults, подешавања апликације |
| Library/Application Support | .applicationSupportDirectory | Да | Базе података, CoreData, Realm |
| tmp | .tmpDirectory (NSTemporaryDirectory) | Не | Привремени фајлови сесије |
Apple правило: ако се фајл може обновити са интернета или поново креирати — треба да се чува у Caches (без backup-а). Ако фајл садржи корисничке податке — Documents (са backup-ом). Неправилно постављање фајлова је један од честих разлога одбијања апликације, јер 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 — кориснички подаци са backup-ом у iCloud. Library/Caches — кешеви без backup-а. 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. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође