FileManager — шта је то, рад са фајл системом iOS

Аутор: IT Sectr Објављено: 2026-07-09 Време читања: 9 мин

FileManager — је класа из Foundation framework-а, која пружа интерфејс за рад са фајл системом iOS, macOS и других Apple платформи. Омогућава креирање, читање, премештање и брисање фајлова и директоријума, као и управљање метаподацима и правима приступа. У iOS-у све операције FileManager-а су ограничене оквирима Sandbox-а апликације. Према Apple Developer Documentation (2026), FileManager је thread-safe и може се користити из позадинских нити, али све операције са фајл системом морају се изводити узимајући у обзир sandbox и права приступа 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 је thread-safe: 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 — за корисничке податке који треба да се чувају између покретања и да се backup-ују у iCloud. Library — за фајлове апликације: кешеве (Caches), подешавања (Preferences), базе података (Application Support). tmp — за привремене фајлове које систем може да обрише у било ком тренутку између покретања апликације.

ДиректоријумFileManager URLBackupКоришћење
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 за стримовно читање и упис великих фајлова, који не учитава цео фајл у меморију.

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 — кориснички подаци са backup-ом у iCloud. Library/Caches — кешеви без backup-а. 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 — три главна директоријума апликације са различитим правилима backup-а и животног циклуса.
  • URL-based API је пожељнији од String-based путања за компатибилност са Sandbox-ом и Security-Scoped Bookmarks.
  • FileHandle и стримовна обрада — једини начин рада са великим фајловима без прекорачења меморије.
  • FileManagerDelegate омогућава контролу операција премештања, копирања и брисања кроз should-методе.
  • iCloud интеграција је доступна кроз ubiquityContainer и NSMetadataQuery за рад са облачним фајловима.
  • Перформансе фајл операција су критичне — извршавајте их на позадинским редовима и минимизирајте позиве fileExists.

Развићемо мобилну апликацију под кључ

IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.

Разговарајте о пројекту

Прочитајте такође