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 — 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.
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)")
}
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 FileManager | Záloha | Použití |
|---|---|---|---|
| Documents | .documentDirectory | Ano | Uživatelská data, soubory, export |
| Library/Caches | .cachesDirectory | Ne | Mezipaměti obrázků, dočasná data |
| Library/Preferences | .libraryDirectory + "/Preferences" | Ano | UserDefaults, nastavení aplikace |
| Library/Application Support | .applicationSupportDirectory | Ano | Databáze, CoreData, Realm |
| tmp | .tmpDirectory (NSTemporaryDirectory) | Ne | Doč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.
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.
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.
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.
// 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 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.
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:
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
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.
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.
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:).
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).
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í
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í.
Přečtěte si také