FileManager ist eine Klasse aus dem Foundation-Framework, die eine Schnittstelle für die Arbeit mit dem Dateisystem unter iOS, macOS und anderen Apple-Plattformen bereitstellt. Sie ermöglicht das Erstellen, Lesen, Verschieben und Löschen von Dateien und Verzeichnissen sowie die Verwaltung von Metadaten und Zugriffsberechtigungen. In iOS sind alle FileManager-Operationen durch den App-Sandbox eingeschränkt. Laut Apple Developer Documentation (2026) ist FileManager threadsicher und kann aus Hintergrundthreads verwendet werden, aber alle Dateisystemoperationen müssen unter Berücksichtigung der Sandbox und der Security-Scoped Bookmarks Zugriffsberechtigungen durchgeführt werden.
Wichtigste Punkte
FileManager ist eine Singleton-Klasse aus dem Foundation-Framework, die eine einheitliche API für die Interaktion mit dem Dateisystem auf allen Apple-Plattformen bereitstellt. Sie ist über FileManager.default oder durch Erstellen einer Instanz mit einem benutzerdefinierten Delegaten verfügbar.
Zu den Hauptfunktionen der Klasse gehören: Überprüfen der Dateiexistenz (fileExists), Erstellen von Verzeichnissen (createDirectory), Kopieren und Verschieben (copyItem, moveItem), Löschen (removeItem), Abrufen von Attributen (attributesOfItem) und Verzeichnisinhalten (contentsOfDirectory). FileManager ist eng mit NSData, String und JSONEncoder/Decoder für die Datenserialisierung verbunden.
FileManager ist threadsicher: Apple garantiert sichere Methodenaufrufe aus verschiedenen Threads. Allerdings können Dateisystemoperationen bei großen Dateien langsam sein, daher empfiehlt Apple, sie in einer Hintergrundwarteschlange (DispatchQueue.global) auszuführen und FileManagerDelegate-Methoden aufzurufen, um den Fortschritt zu melden.
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)")
}
Jede iOS-App hat drei Hauptverzeichnisse, die über FileManager innerhalb des Sandbox zugänglich sind: Documents, Library und tmp. Jedes hat seinen eigenen Zweck und Sicherungsregeln, die für die App Store-Prüfung entscheidend sind.
Documents — für Benutzerdaten, die zwischen Starts erhalten bleiben und in iCloud gesichert werden sollen. Library — für App-Dateien: Caches, Einstellungen (Preferences), Datenbanken (Application Support). tmp — für temporäre Dateien, die vom System zwischen App-Starts jederzeit gelöscht werden können.
| Verzeichnis | FileManager URL | Sicherung | Verwendung |
|---|---|---|---|
| Documents | .documentDirectory | Ja | Benutzerdaten, Dateien, Exporte |
| Library/Caches | .cachesDirectory | Nein | Bildercaches, temporäre Daten |
| Library/Preferences | .libraryDirectory + "Preferences" | Ja | UserDefaults, App-Einstellungen |
| Library/Application Support | .applicationSupportDirectory | Ja | Datenbanken, CoreData, Realm |
| tmp | .tmpDirectory (NSTemporaryDirectory) | Nein | Temporäre Sitzungsdateien |
Apple-Regel: Wenn eine Datei aus dem Internet wiederhergestellt oder neu erstellt werden kann — soll sie in Caches gespeichert werden (ohne Sicherung). Wenn eine Datei Benutzerdaten enthält — Documents (mit Sicherung). Falsche Dateiplatzierung ist ein häufiger Grund für App-Ablehnungen, da Apple die Einhaltung der Storage- und iCloud-Backup-Richtlinien prüft.
FileManager selbst bietet keine Methoden zum Lesen von Dateiinhalten — dafür verwenden Sie NSData(contentsOf), String(contentsOf) oder FileHandle-Methoden. FileManager ist für die Verwaltung von Dateien zuständig: Existenzprüfung, Verschieben, Kopieren, Löschen.
Zum Schreiben von Daten verwenden Sie die createFile(atPath:contents:attributes:)-Methode oder High-Level-APIs — data.write(to:), JSONEncoder.encode und PropertyListEncoder. FileManager bietet auch FileHandle für das Streaming-Lesen und -Schreiben großer Dateien, das nicht die gesamte Datei in den Speicher lädt.
struct UserSettings: Codable {
let username: String
let isDarkMode: Bool
let fontSize: Int
}
let settings = UserSettings(
username: "developer",
isDarkMode: true,
fontSize: 16
)
// JSON in Documents schreiben
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 lesen
let loadedData = try Data(contentsOf: url)
let loadedSettings = try JSONDecoder()
.decode(UserSettings.self, from: loadedData)
Verwenden Sie beim Schreiben options: .atomic — dies stellt sicher, dass die Datei bei einem Schreibfehler nicht beschädigt wird: Daten werden zuerst in eine temporäre Datei gespeichert und dann atomar zum Zielpfad verschoben. Verwenden Sie zum Lesen großer Dateien FileHandle mit .readingMode und lesen Sie Daten in Blöcken, wobei Sie den Speicherverbrauch kontrollieren.
FileManager stellt Methoden für die vollständige Verzeichnisverwaltung bereit: createDirectory (Erstellen aller Zwischenordner über withIntermediateDirectories), contentsOfDirectory (Abrufen einer Dateiliste), enumeratorAt (rekursive Durchlauf) und subpathsOfDirectory (alle Pfade innerhalb eines Verzeichnisses).
Die enumeratorAt-Methode gibt einen DirectoryEnumerator zurück, der das effiziente Durchlaufen großer Verzeichnisse ermöglicht, ohne alle Inhalte in den Speicher zu laden. Es unterstützt die Filterung über skipDescendants und liefert Attribute jedes Elements ohne zusätzliche Dateisystemabfrage.
// Rekursive Verzeichnisdurchlauf
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")
}
}
}
Zum Löschen eines Verzeichnisses verwenden Sie removeItem(at:). Warnung: Das Löschen eines Verzeichnisses in iOS ist irreversibel — Dateien landen nicht wie unter macOS im Papierkorb. Stellen Sie vor dem Löschen sicher, dass Sie die Dateien aus diesem Verzeichnis nicht mehr benötigen, und führen Sie den Vorgang in einem Hintergrundthread aus, da das Löschen vieler Dateien die UI blockieren kann.
FileManager integriert sich mit iCloud Drive über die Methode URLForUbiquityContainerIdentifier, die die URL des iCloud-Verzeichnisses für die App zurückgibt. Dazu muss die iCloud-Funktion im Projekt aktiviert und die entsprechende Berechtigung hinzugefügt werden.
iCloud-Dateien werden automatisch synchronisiert, aber FileManager bietet Methoden zur manuellen Steuerung: startDownloadingUbiquitousItem erzwingt den Download, evictUbiquitousItem entfernt die lokale Kopie und urlOfItem(at:) gibt die lokale URL für eine iCloud-Datei zurück. NSMetadataQuery wird zum Durchsuchen von Dateien in iCloud verwendet.
Kritische Einschränkung: iCloud Drive wird für Dateien im Documents-Verzeichnis nicht unterstützt — nur für Dateien in ubiquityContainer. Versuchen Sie nicht, Documents über iCloud zu synchronisieren; verwenden Sie dafür NSUbiquitousKeyValueStore für kleine Datenmengen oder Core Data mit CloudKit für komplexe Strukturen.
Operationen mit FileManager können teuer sein, insbesondere auf Geräten mit langsamem Flash-Speicher. Zu den wichtigsten Empfehlungen von Apple gehören die Ausführung aller Dateioperationen in Hintergrundwarteschlangen, die Minimierung von fileExistsAtPath-Aufrufen und das Zwischenspeichern von Ergebnissen.
Die fileExists-Methode führt einen stat()-Systemaufruf durch, der relativ langsam ist. Wenn Sie die Existenz einer Datei vor dem Lesen überprüfen, versuchen Sie besser gleich, sie zu lesen und behandeln Sie den Fehler — dies führt denselben stat aus, vermeidet aber einen doppelten Systemaufruf. Verwenden Sie für Massenprüfungen enumeratorAt mit resourceValues.
Zur Optimierung der Arbeit mit großen Datenmengen:
Apple Instruments bietet die Vorlage File Activity zum Profiling von Dateioperationen. Verwenden Sie sie, um Engpässe zu identifizieren — z.B. häufige fileExists-Aufrufe in einer Schleife oder Schreiboperationen im Hauptthread. Die häufigsten Leistungsprobleme hängen mit dem synchronen Schreiben großer Dateien beim Beenden der App zusammen.
Häufig gestellte Fragen
FileManager ist eine Klasse des Foundation-Frameworks für die Arbeit mit dem Apple-Dateisystem. Sie bietet eine API zum Erstellen, Lesen, Verschieben und Löschen von Dateien und Verzeichnissen. In iOS ist ihre Funktionalität auf den App-Sandbox beschränkt, mit Ausnahme von Security-Scoped Bookmarks.
Documents — Benutzerdaten mit iCloud-Backup. Library/Caches — Caches ohne Backup. Library/Application Support — Datenbanken. tmp — Temporäre Dateien. App Group Container — für gemeinsam genutzte Daten zwischen Apps derselben Gruppe.
Rufen Sie FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first auf. Die Methode gibt eine URL mit dem absoluten Pfad zum Documents-Verzeichnis im Sandbox der aktuellen App zurück. Verwenden Sie fileExists(atPath:) zur Existenzprüfung.
Nein, der iOS-Sandbox verhindert den Zugriff auf das Dateisystem anderer Apps. Ausnahmen: App Groups (gemeinsames Verzeichnis für Apps desselben Entwicklers) und Security-Scoped Bookmarks (Dateizugriff über UIDocumentPicker und iCloud Drive).
Verwenden Sie die Option .atomic beim Schreiben — Daten werden zuerst in eine temporäre Datei gespeichert und dann atomar zum Zielpfad verschoben. Dies verhindert Dateibeschädigung bei Schreibfehlern. Verwenden Sie für große Datenmengen FileHandle mit blockweisem Schreiben von 1-2 MB.
Zusammenfassung
Wir entwickeln eine mobile Applikation schlüsselfertig
IT Sectr entwickelt seit 2017 iOS- und Android-Apps für Startups und Unternehmen. Wir beraten Sie und schlagen die beste Lösung vor.
Lesen Sie auch