FileManager — is een klasse uit het Foundation-framework die een interface biedt voor het werken met het bestandssysteem van iOS, macOS en andere Apple-platforms. Het maakt het mogelijk om bestanden en mappen te maken, lezen, verplaatsen en verwijderen, en om metadata en toegangsrechten te beheren. In iOS zijn alle FileManager-bewerkingen beperkt tot de Sandbox van de app. Volgens Apple Developer Documentation (2026) is FileManager thread-safe en kan het vanuit achtergrondthreads worden gebruikt, maar alle bestandssysteembewerkingen moeten worden uitgevoerd met inachtneming van de sandbox en toegangsrechten van Security-Scoped Bookmarks.
Belangrijkste punten
FileManager — een singleton-klasse uit het Foundation-framework die een uniforme API biedt voor interactie met het bestandssysteem op alle Apple-platforms. Het is toegankelijk via FileManager.default of door een instantie met een aangepaste delegate te maken.
De belangrijkste mogelijkheden van de klasse omvatten: controleren of een bestand bestaat (fileExists), mappen maken (createDirectory), kopiëren en verplaatsen (copyItem, moveItem), verwijderen (removeItem), attributen ophalen (attributesOfItem) en mapinhoud (contentsOfDirectory). FileManager is nauw verbonden met NSData, String en JSONEncoder/Decoder voor het serialiseren van gegevens.
FileManager is thread-safe: Apple garandeert de veiligheid van het aanroepen van methoden vanuit verschillende threads. Bestandssysteembewerkingen kunnen echter traag zijn bij grote bestanden, dus Apple raadt aan ze op een achtergrondwachtrij (DispatchQueue.global) uit te voeren en FileManagerDelegate-methoden aan te roepen om over de voortgang te informeren.
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)")
}
Elke iOS-app heeft drie hoofdmap die toegankelijk zijn via FileManager binnen de Sandbox: Documents, Library en tmp. Elk heeft zijn eigen doel en back-upregels, waarvan naleving essentieel is voor het doorstaan van de App Store-beoordeling.
Documents — voor gebruikersgegevens die tussen starts moeten worden bewaard en naar iCloud moeten worden geback-upt. Library — voor app-bestanden: caches (Caches), instellingen (Preferences), databases (Application Support). tmp — voor tijdelijke bestanden die op elk moment door het systeem kunnen worden verwijderd tussen app-starts.
| Map | FileManager URL | Back-up | Gebruik |
|---|---|---|---|
| Documents | .documentDirectory | Ja | Gebruikersgegevens, bestanden, export |
| Library/Caches | .cachesDirectory | Nee | Afbeeldingscaches, tijdelijke gegevens |
| Library/Preferences | .libraryDirectory + "/Preferences" | Ja | UserDefaults, app-instellingen |
| Library/Application Support | .applicationSupportDirectory | Ja | Databases, CoreData, Realm |
| tmp | .tmpDirectory (NSTemporaryDirectory) | Nee | Tijdelijke sessiebestanden |
Apple-regel: als een bestand van internet kan worden hersteld of opnieuw kan worden aangemaakt — moet het in Caches worden opgeslagen (zonder back-up). Als een bestand gebruikersgegevens bevat — Documents (met back-up). Onjuiste plaatsing van bestanden is een van de veelvoorkomende redenen voor afwijzing van de app, omdat Apple de naleving van de Storage & iCloud Backup Guidelines controleert.
FileManager biedt zelf geen methoden voor het lezen van bestandsinhoud — hiervoor worden NSData(contentsOf), String(contentsOf) of FileHandle-methoden gebruikt. FileManager is verantwoordelijk voor het beheren van bestanden: controleren op bestaan, verplaatsen, kopiëren, verwijderen.
Voor het schrijven van gegevens wordt de methode createFile(atPath:contents:attributes:) of hoogwaardige API's gebruikt — data.write(to:), JSONEncoder.encode en PropertyListEncoder. FileManager biedt ook FileHandle voor het streamen van grote bestanden, die niet het hele bestand in het geheugen laadt.
struct UserSettings: Codable {
let username: String
let isDarkMode: Bool
let fontSize: Int
}
let settings = UserSettings(
username: "developer",
isDarkMode: true,
fontSize: 16
)
// JSON naar Documents schrijven
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 lezen
let loadedData = try Data(contentsOf: url)
let loadedSettings = try JSONDecoder()
.decode(UserSettings.self, from: loadedData)
Gebruik bij het schrijven options: .atomic — dit garandeert dat het bestand niet beschadigd raakt bij een schrijffout: gegevens worden eerst naar een tijdelijk bestand geschreven en vervolgens atomair naar het doelpad verplaatst. Gebruik voor het lezen van grote bestanden FileHandle met .readingMode en lees gegevens in delen, terwijl u het geheugengebruik controleert.
FileManager biedt methoden voor volledig mapbeheer: createDirectory (aanmaken van alle tussenliggende mappen via withIntermediateDirectories), contentsOfDirectory (lijst met bestanden ophalen), enumeratorAt (recursieve doorloop) en subpathsOfDirectory (alle paden binnen een map).
De methode enumeratorAt retourneert een DirectoryEnumerator waarmee grote mappen efficiënt kunnen worden doorlopen zonder de hele inhoud in het geheugen te laden. Het ondersteunt filteren via skipDescendants en biedt attributen van elk element zonder extra query op het bestandssysteem.
// Recursieve mappendoorloop
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")
}
}
}
Gebruik removeItem(at:) om een map te verwijderen. Let op: het verwijderen van een map in iOS is onomkeerbaar — bestanden belanden niet in de prullenbak, zoals op macOS. Zorg ervoor dat u geen bestanden uit deze map meer gebruikt voordat u deze verwijdert, en voer de bewerking uit op een achtergrondthread, omdat het verwijderen van veel bestanden de gebruikersinterface kan blokkeren.
FileManager integreert met iCloud Drive via de methode URLForUbiquityContainerIdentifier, die de URL van de iCloud-map voor de app retourneert. Voor werking is het nodig om iCloud capability in het project in te schakelen en de bijbehorende entitlement toe te voegen.
iCloud-bestanden worden automatisch gesynchroniseerd, maar FileManager biedt methoden voor handmatige controle: startDownloadingUbiquitousItem start geforceerd met downloaden, evictUbiquitousItem verwijdert de lokale kopie, en urlOfItem(at:) retourneert de lokale URL voor het iCloud-bestand. NSMetadataQuery wordt gebruikt om bestanden in iCloud te zoeken.
Kritieke beperking: iCloud Drive wordt niet ondersteund voor bestanden in de Documents-map — alleen voor bestanden in ubiquityContainer. Probeer Documents niet te synchroniseren via iCloud; gebruik hiervoor NSUbiquitousKeyValueStore voor kleine hoeveelheden gegevens of Core Data met CloudKit voor complexe structuren.
Bewerkingen met FileManager kunnen kostbaar zijn, vooral op apparaten met traag flash-geheugen. De belangrijkste aanbevelingen van Apple omvatten het uitvoeren van alle bestandsbewerkingen op achtergrondwachtrijen, het minimaliseren van het aantal fileExistsAtPath-aanroepen en het gebruik van caching van resultaten.
De methode fileExists voert een systeemaanroep stat() uit, die relatief traag is. Als u controleert of een bestand bestaat voordat u het leest, kunt u beter direct proberen het te lezen en de fout af te handelen — dit voert dezelfde stat uit, maar elimineert een dubbele systeemaanroep. Gebruik voor massa-controles enumeratorAt met resourceValues.
Voor het optimaliseren van werken met grote hoeveelheden gegevens:
Apple Instruments biedt het sjabloon File Activity voor het profileren van bestandsbewerkingen. Gebruik het om knelpunten te identificeren — bijvoorbeeld frequente fileExists-aanroepen in een lus of schrijfbewerkingen op de main thread. De meest voorkomende prestatieproblemen hebben te maken met synchroon schrijven van grote bestanden bij het minimaliseren van de app.
Veelgestelde vragen
FileManager — een klasse van het Foundation-framework voor het werken met het Apple-bestandssysteem. Biedt een API voor het maken, lezen, verplaatsen en verwijderen van bestanden en mappen. In iOS is het werk ervan beperkt tot de Sandbox van de app, met uitzondering van Security-Scoped Bookmarks.
Documents — gebruikersgegevens met back-up in iCloud. Library/Caches — caches zonder back-up. Library/Application Support — databases. tmp — tijdelijke bestanden. App Group Container — voor gedeelde gegevens tussen apps van dezelfde groep.
Roep FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first aan. De methode retourneert een URL met het absolute pad naar de Documents-map in de Sandbox van de huidige app. Gebruik fileExists(atPath:) om het bestaan te controleren.
Nee, de iOS-Sandbox verbiedt toegang tot het bestandssysteem van andere apps. Uitzonderingen: App Groups (gedeelde map voor apps van dezelfde ontwikkelaar) en Security-Scoped Bookmarks (toegang tot bestanden via UIDocumentPicker en iCloud Drive).
Gebruik de optie .atomic bij het schrijven — gegevens worden eerst naar een tijdelijk bestand geschreven en vervolgens atomair naar het doelpad verplaatst. Dit voorkomt beschadiging van het bestand bij een schrijffout. Gebruik voor grote gegevens FileHandle met schrijven in delen van 1-2 MB.
Samenvatting
We ontwikkelen een mobiele applicatie turnkey
IT Sectr creëert sinds 2017 iOS- en Android-applicaties voor startups en bedrijven. We adviseren u en stellen de beste oplossing voor.
Lees ook