FileManager — co to je, práce se souborovým systémem iOS

Autor: IT Sectr Publikováno: 2026-07-09 Doba čtení: 9 min

FileManager — je třída z frameworku Foundation, poskytující rozhraní pro práci se souborovým systémem iOS, macOS a dalších platforem Apple. Umožňuje vytvářet, číst, přesouvat a mazat soubory a adresáře, stejně jako spravovat metadata a přístupová práva. V iOS jsou všechny operace FileManager omezeny Sandboxem aplikace. Podle Apple Developer Documentation (2026) je FileManager thread-safe a lze jej používat z vláken na pozadí, ale všechny operace se souborovým systémem musí být prováděny s ohledem na sandbox a přístupová práva Security-Scoped Bookmarks.

Hlavní body

  • FileManager — hlavní třída Foundation pro operace se souborovým systémem: čtení, zápis, přesun, mazání souborů.
  • Sandbox omezuje přístup FileManager pouze na adresáře aplikace — Documents, Library, tmp a App Group.
  • API založené na URL (fileManager.urls) je preferováno před String-based (NSHomeDirectory) pro moderní aplikace.
  • FileManagerDelegate umožňuje sledování a kontrolu souborových operací pomocí shouldMoveItemAt a shouldRemoveItemAt.
  • iCloud Drive je přístupný přes FileManager při zapnutém ubiquityContainer a odpovídajících entitlements.

Co je FileManager

FileManager — singletonová třída z frameworku Foundation, poskytující jednotné API pro interakci se souborovým systémem na všech platformách Apple. Je přístupná přes FileManager.default nebo vytvořením instance s vlastním delegátem.

Hlavní možnosti třídy zahrnují: kontrolu existence souboru (fileExists), vytváření adresářů (createDirectory), kopírování a přesun (copyItem, moveItem), mazání (removeItem), získávání atributů (attributesOfItem) a obsahu adresářů (contentsOfDirectory). FileManager je úzce propojen s NSData, String a JSONEncoder/Decoder pro serializaci dat.

FileManager je thread-safe: Apple garantuje bezpečnost volání metod z různých vláken. Nicméně operace se souborovým systémem mohou být pomalé u velkých souborů, proto Apple doporučuje provádět je ve frontě na pozadí (DispatchQueue.global) a volat metody FileManagerDelegate pro informování o průběhu.

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)")
}

Hlavní adresáře iOS aplikace

Každá iOS aplikace má tři hlavní adresáře přístupné přes FileManager v rámci Sandboxu: Documents, Library a tmp. Každý má svůj účel a pravidla zálohování, jejichž dodržování je klíčové pro schválení v App Store.

Documents — pro uživatelská data, která musí být zachována mezi spuštěními a zálohována do iCloud. Library — pro soubory aplikace: mezipaměti (Caches), nastavení (Preferences), databáze (Application Support). tmp — pro dočasné soubory, které může systém kdykoli smazat mezi spuštěními aplikace.

AdresářURL FileManagerZálohaPoužití
Documents.documentDirectoryAnoUživatelská data, soubory, export
Library/Caches.cachesDirectoryNeMezipaměti obrázků, dočasná data
Library/Preferences.libraryDirectory + "/Preferences"AnoUserDefaults, nastavení aplikace
Library/Application Support.applicationSupportDirectoryAnoDatabáze, CoreData, Realm
tmp.tmpDirectory (NSTemporaryDirectory)NeDočasné soubory relace

Pravidlo Apple: pokud lze soubor obnovit z internetu nebo znovu vytvořit — měl by být uložen v Caches (bez zálohy). Pokud soubor obsahuje uživatelská data — Documents (se zálohou). Nesprávné umístění souborů je jedním z častých důvodů zamítnutí aplikace, protože Apple kontroluje dodržování Storage & iCloud Backup Guidelines.

Čtení a zápis souborů

FileManager sám neposkytuje metody pro čtení obsahu souborů — k tomu se používají NSData(contentsOf), String(contentsOf) nebo metody FileHandle. FileManager je zodpovědný za správu souborů: kontrolu existence, přesun, kopírování, mazání.

Pro zápis dat se používá metoda createFile(atPath:contents:attributes:) nebo vysokoúrovňová API — data.write(to:), JSONEncoder.encode a PropertyListEncoder. FileManager také poskytuje FileHandle pro streamové čtení a zápis velkých souborů, který nenačítá celý soubor do paměti.

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

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

// Zapsat JSON do 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)

// Přečíst JSON
let loadedData = try Data(contentsOf: url)
let loadedSettings = try JSONDecoder()
    .decode(UserSettings.self, from: loadedData)

Při zápisu používejte options: .atomic — to zaručuje, že soubor nebude poškozen v případě selhání zápisu: data jsou nejprve uložena do dočasného souboru a poté atomicky přesunuta do cílové cesty. Pro čtení velkých souborů používejte FileHandle s .readingMode a čtěte data po částech, kontrolujte spotřebu paměti.

Správa adresářů

FileManager poskytuje metody pro úplnou správu adresářů: createDirectory (vytvoření všech mezilehlých složek pomocí withIntermediateDirectories), contentsOfDirectory (získání seznamu souborů), enumeratorAt (rekurzivní procházení) a subpathsOfDirectory (všechny cesty v adresáři).

Metoda enumeratorAt vrací DirectoryEnumerator, který umožňuje efektivní procházení velkých adresářů bez načítání celého obsahu do paměti. Podporuje filtrování přes skipDescendants a poskytuje atributy každého prvku bez dalšího dotazu na souborový systém.

swift
// Rekurzivní procházení adresářů
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")
        }
    }
}

Pro smazání adresáře použijte removeItem(at:). Pozor: smazání adresáře v iOS je nevratné — soubory nejdou do koše, jako na macOS. Před smazáním se ujistěte, že již nepoužíváte soubory z tohoto adresáře, a proveďte operaci na vlákně na pozadí, protože smazání velkého množství souborů může zablokovat UI.

FileManager a iCloud

FileManager se integruje s iCloud Drive prostřednictvím metody URLForUbiquityContainerIdentifier, která vrací URL iCloud adresáře pro aplikaci. Pro fungování je nutné povolit iCloud capability v projektu a přidat odpovídající entitlement.

iCloud soubory se synchronizují automaticky, ale FileManager poskytuje metody pro ruční ovládání: startDownloadingUbiquitousItem vynutí zahájení stahování, evictUbiquitousItem smaže místní kopii a urlOfItem(at:) vrátí místní URL pro iCloud soubor. NSMetadataQuery se používá pro vyhledávání souborů v iCloud.

Kritické omezení: iCloud Drive není podporován pro soubory v adresáři Documents — pouze pro soubory v ubiquityContainer. Nepokoušejte se synchronizovat Documents přes iCloud; k tomu použijte NSUbiquitousKeyValueStore pro malé objemy dat nebo Core Data s CloudKit pro složité struktury.

Výkon FileManager

Operace s FileManager mohou být nákladné, zejména na zařízeních s pomalou flash pamětí. Hlavní doporučení Apple zahrnují provádění všech souborových operací ve frontách na pozadí, minimalizaci počtu volání fileExistsAtPath a používání ukládání výsledků do mezipaměti.

Metoda fileExists provádí systémové volání stat(), které je relativně pomalé. Pokud kontrolujete existenci souboru před jeho čtením, je lepší se rovnou pokusit jej přečíst a zpracovat chybu — to provádí stejný stat, ale eliminuje dvojité systémové volání. Pro hromadné kontroly použijte enumeratorAt s resourceValues.

Pro optimalizaci práce s velkými objemy dat:

  • Používejte FileHandle pro streamové zpracování velkých souborů
  • Ukládejte do mezipaměti výsledky fileManager.urls pro často používané adresáře
  • Provádějte dávkové operace v granulární frontě, vyhněte se blokování hlavního vlákna
  • Používejte CoordinatedFileManager pro bezpečný přístup z více vláken

Apple Instruments poskytuje šablonu File Activity pro profilování souborových operací. Použijte ji k identifikaci úzkých míst — například častých volání fileExists ve smyčce nebo operací zápisu na hlavním vlákně. Nejčastější problémy s výkonem souvisí se synchronním zápisem velkých souborů při minimalizaci aplikace.

Často kladené otázky

Co je FileManager v iOS?

FileManager — třída frameworku Foundation pro práci se souborovým systémem Apple. Poskytuje API pro vytváření, čtení, přesun, mazání souborů a adresářů. V iOS je jeho činnost omezena Sandboxem aplikace, s výjimkou Security-Scoped Bookmarks.

Jaké adresáře jsou přístupné přes FileManager v iOS?

Documents — uživatelská data se zálohou v iCloud. Library/Caches — mezipaměti bez zálohy. Library/Application Support — databáze. tmp — dočasné soubory. App Group Container — pro sdílená data mezi aplikacemi stejné skupiny.

Jak získat cestu k Documents přes FileManager?

Zavolejte FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first. Metoda vrací URL s absolutní cestou k adresáři Documents v Sandboxu aktuální aplikace. Pro kontrolu existence použijte fileExists(atPath:).

Mohu přes FileManager přistupovat k souborům jiných aplikací?

Ne, Sandbox iOS zakazuje přístup k souborovému systému jiných aplikací. Výjimky: App Groups (sdílený adresář pro aplikace stejného vývojáře) a Security-Scoped Bookmarks (přístup k souborům přes UIDocumentPicker a iCloud Drive).

Jak bezpečně zapisovat soubory přes FileManager?

Používejte volbu .atomic při zápisu — data jsou nejprve uložena do dočasného souboru, poté atomicky přesunuta do cílové cesty. To zabraňuje poškození souboru při selhání zápisu. Pro velká data používejte FileHandle se zápisem po částech 1-2 MB.

Shrnutí

  • FileManager — centrální třída Foundation pro všechny operace se souborovým systémem v iOS: od kontroly existence po rekurzivní procházení adresářů.
  • Documents, Library, tmp — tři hlavní adresáře aplikace s různými pravidly zálohování a životního cyklu.
  • API založené na URL je preferováno před cestami String-based pro kompatibilitu se Sandboxem a Security-Scoped Bookmarks.
  • FileHandle a streamové zpracování — jediný způsob práce s velkými soubory bez přetečení paměti.
  • FileManagerDelegate umožňuje kontrolu operací přesunu, kopírování a mazání pomocí should-metod.
  • Integrace iCloud je dostupná přes ubiquityContainer a NSMetadataQuery pro práci s cloudovými soubory.
  • Výkon souborových operací je kritický — provádějte je ve frontách na pozadí a minimalizujte volání fileExists.

Vyvineme mobilní aplikaci na klíč

IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.

Prodiskutovat projekt

Přečtěte si také