FileManager — е клас от Foundation framework, предоставящ интерфейс за работа с файловата система на iOS, macOS и други платформи на Apple. Той позволява създаване, четене, преместване и изтриване на файлове и директории, както и управление на метаданни и права за достъп. В iOS всички операции на FileManager са ограничени от Sandbox на приложението. Според Apple Developer Documentation (2026), FileManager е thread-safe и може да се използва от фонови нишки, но всички операции с файловата система трябва да се извършват, като се вземат предвид sandbox и правата за достъп Security-Scoped Bookmarks.
Основни точки
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 за информиране за напредъка.
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 приложение има три основни директории, достъпни чрез FileManager в рамките на Sandbox: Documents, Library и tmp. Всяка има своето предназначение и правила за архивиране, чието спазване е от решаващо значение за преминаване на преглед в App Store.
Documents — за потребителски данни, които трябва да се запазват между стартиранията и да се архивират в iCloud. Library — за файлове на приложението: кешове (Caches), настройки (Preferences), бази данни (Application Support). tmp — за временни файлове, които могат да бъдат изтрити от системата по всяко време между стартиранията на приложението.
| Директория | FileManager URL | Архивиране | Употреба |
|---|---|---|---|
| Documents | .documentDirectory | Да | Потребителски данни, файлове, експорт |
| Library/Caches | .cachesDirectory | Не | Кешове на изображения, временни данни |
| Library/Preferences | .libraryDirectory + "/Preferences" | Да | UserDefaults, настройки на приложението |
| Library/Application Support | .applicationSupportDirectory | Да | Бази данни, CoreData, Realm |
| tmp | .tmpDirectory (NSTemporaryDirectory) | Не | Временни файлове на сесията |
Правило на Apple: ако файл може да бъде възстановен от интернет или пресъздаден — трябва да се съхранява в Caches (без архивиране). Ако файлът съдържа потребителски данни — Documents (с архивиране). Неправилното поставяне на файлове е една от честите причини за отхвърляне на приложението, тъй като 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 за поточно четене и запис на големи файлове, който не зарежда целия файл в паметта.
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 и предоставя атрибути на всеки елемент без допълнителна заявка към файловата система.
// Рекурсивно обхождане на директория
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. Преди изтриване се уверете, че вече не използвате файлове от тази директория, и изпълнете операцията на фонова нишка, тъй като изтриването на много файлове може да блокира потребителския интерфейс.
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 могат да бъдат скъпи, особено на устройства с бавна флаш памет. Основните препоръки на Apple включват извършване на всички файлови операции в опашки на заден план, минимизиране на броя на извикванията на fileExistsAtPath и използване на кеширане на резултати.
Методът fileExists изпълнява системно извикване stat(), което е относително бавно. Ако проверявате съществуването на файл преди да го прочетете, по-добре е веднага да опитате да го прочетете и да обработите грешката — това изпълнява същия stat, но елиминира двойното системно извикване. За масови проверки използвайте enumeratorAt с resourceValues.
За оптимизиране на работа с големи обеми данни:
Apple Instruments предоставя шаблон File Activity за профилиране на файлови операции. Използвайте го за идентифициране на тесни места — например чести извиквания на fileExists в цикъл или операции за запис на основната нишка. Най-честите проблеми с производителността са свързани със синхронен запис на големи файлове при минимизиране на приложението.
Често задавани въпроси
FileManager — клас на Foundation framework за работа с файловата система на Apple. Предоставя API за създаване, четене, преместване, изтриване на файлове и директории. В iOS работата му е ограничена от Sandbox на приложението, с изключение на Security-Scoped Bookmarks.
Documents — потребителски данни с архивиране в iCloud. Library/Caches — кешове без архивиране. Library/Application Support — бази данни. tmp — временни файлове. App Group Container — за споделени данни между приложения от една група.
Извикайте FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first. Методът връща URL с абсолютен път до директорията Documents в Sandbox на текущото приложение. За проверка на съществуване използвайте fileExists(atPath:).
Не, Sandbox на iOS забранява достъпа до файловата система на други приложения. Изключения: App Groups (споделена директория за приложения на един разработчик) и Security-Scoped Bookmarks (достъп до файлове чрез UIDocumentPicker и iCloud Drive).
Използвайте опция .atomic при запис — данните първо се запазват във временен файл, след което атомарно се преместват към целевия път. Това предотвратява повреда на файла при грешка при запис. За големи данни използвайте FileHandle с запис на части от 1-2 MB.
Резюме
Ще разработим мобилно приложение под ключ
IT Sectr създава iOS и Android приложения за стартъпи и бизнеси от 2017 г. Ще ви консултираме и ще предложим най-доброто решение.
Прочетете също