FileManager — egy osztály a Foundation keretrendszerből, amely interfészt biztosít az iOS, macOS és más Apple platformok fájlrendszerével való munkához. Lehetővé teszi fájlok és könyvtárak létrehozását, olvasását, áthelyezését és törlését, valamint a metaadatok és hozzáférési jogosultságok kezelését. iOS-ben az összes FileManager művelet az alkalmazás Sandbox-ának kereteire korlátozódik. A Apple Developer Documentation (2026) szerint a FileManager thread-safe és használható háttérszálakból, de a fájlrendszerrel végzett összes műveletet a sandbox és a Security-Scoped Bookmarks hozzáférési jogosultságok figyelembevételével kell végrehajtani.
Főbb pontok
FileManager — egy singleton osztály a Foundation keretrendszerből, amely egységes API-t biztosít a fájlrendszerrel való interakcióhoz az összes Apple platformon. Elérhető a FileManager.default vagy egy egyéni delegáltal létrehozott példányon keresztül.
Az osztály fő képességei közé tartozik: fájl létezésének ellenőrzése (fileExists), könyvtárak létrehozása (createDirectory), másolás és áthelyezés (copyItem, moveItem), törlés (removeItem), attribútumok lekérése (attributesOfItem) és könyvtártartalom lekérése (contentsOfDirectory). A FileManager szorosan kapcsolódik az NSData, String és JSONEncoder/Decoder osztályokhoz az adatok szerializálásához.
A FileManager thread-safe: az Apple garantálja a metódusok különböző szálakból történő hívásának biztonságát. Azonban a fájlrendszer-műveletek lassúak lehetnek nagy fájlok esetén, ezért az Apple azt javasolja, hogy háttérsorban (DispatchQueue.global) hajtsa végre őket, és hívja meg a FileManagerDelegate metódusokat a folyamat állapotáról való tájékoztatáshoz.
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)")
}
Minden iOS alkalmazásnak három fő könyvtára van, amelyek a FileManager-en keresztül érhetők el a Sandbox-on belül: Documents, Library és tmp. Mindegyiknek megvan a maga célja és biztonsági mentési szabályai, amelyek betartása elengedhetetlen az App Store-ellenőrzésen való áteséshez.
Documents — a felhasználói adatok számára, amelyeket meg kell őrizni az indítások között és biztonsági mentést kell készíteni iCloud-ba. Library — az alkalmazás fájljai számára: gyorsítótárak (Caches), beállítások (Preferences), adatbázisok (Application Support). tmp — ideiglenes fájlok számára, amelyeket a rendszer bármikor törölhet az alkalmazás indításai között.
| Könyvtár | FileManager URL | Biztonsági mentés | Használat |
|---|---|---|---|
| Documents | .documentDirectory | Igen | Felhasználói adatok, fájlok, export |
| Library/Caches | .cachesDirectory | Nem | Képgyorsítótárak, ideiglenes adatok |
| Library/Preferences | .libraryDirectory + "/Preferences" | Igen | UserDefaults, alkalmazás beállítások |
| Library/Application Support | .applicationSupportDirectory | Igen | Adatbázisok, CoreData, Realm |
| tmp | .tmpDirectory (NSTemporaryDirectory) | Nem | Munkamenet ideiglenes fájljai |
Apple-szabály: ha egy fájl visszaállítható az internetről vagy újra létrehozható — a Caches-ben kell tárolni (biztonsági mentés nélkül). Ha a fájl felhasználói adatokat tartalmaz — Documents (biztonsági mentéssel). A fájlok helytelen elhelyezése az alkalmazás elutasításának egyik gyakori oka, mivel az Apple ellenőrzi a Storage & iCloud Backup Guidelines betartását.
FileManager maga nem biztosít metódusokat fájlok tartalmának olvasásához — ehhez az NSData(contentsOf), String(contentsOf) vagy FileHandle metódusokat használják. A FileManager a fájlok kezeléséért felelős: létezés ellenőrzése, áthelyezés, másolás, törlés.
Az adatok írásához a createFile(atPath:contents:attributes:) metódust vagy magas szintű API-kat használnak — data.write(to:), JSONEncoder.encode és PropertyListEncoder. A FileManager FileHandle-t is biztosít nagy fájlok stream-szerű olvasásához és írásához, amely nem tölti be a teljes fájlt a memóriába.
struct UserSettings: Codable {
let username: String
let isDarkMode: Bool
let fontSize: Int
}
let settings = UserSettings(
username: "developer",
isDarkMode: true,
fontSize: 16
)
// JSON írása a Documents-be
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 olvasása
let loadedData = try Data(contentsOf: url)
let loadedSettings = try JSONDecoder()
.decode(UserSettings.self, from: loadedData)
Íráskor használja a options: .atomic opciót — ez garantálja, hogy a fájl nem sérül meg írási hiba esetén: az adatok először egy ideiglenes fájlba kerülnek, majd atomi módon áthelyezésre kerülnek a célútvonalra. Nagy fájlok olvasásához használja a FileHandle-t .readingMode-dal, és olvassa az adatokat darabokban, ellenőrizve a memóriahasználatot.
FileManager metódusokat biztosít a könyvtárak teljes körű kezeléséhez: createDirectory (az összes közbenső mappa létrehozása a withIntermediateDirectories segítségével), contentsOfDirectory (fájllista lekérése), enumeratorAt (rekurzív bejárás) és subpathsOfDirectory (az összes útvonal a könyvtáron belül).
Az enumeratorAt metódus egy DirectoryEnumerator-t ad vissza, amely lehetővé teszi nagy könyvtárak hatékony bejárását anélkül, hogy a teljes tartalmat a memóriába töltené. Támogatja a szűrést a skipDescendants segítségével, és minden elem attribútumait szolgáltatja további fájlrendszer-lekérdezés nélkül.
// Rekurzív könyvtárbejárás
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")
}
}
}
Könyvtár törléséhez használja a removeItem(at:)-t. Figyelem: a könyvtár törlése iOS-ben visszafordíthatatlan — a fájlok nem kerülnek a kukába, mint macOS-en. A törlés előtt győződjön meg arról, hogy már nem használ fájlokat ebből a könyvtárból, és hajtsa végre a műveletet egy háttérszálon, mert sok fájl törlése blokkolhatja a felhasználói felületet.
FileManager integrálódik az iCloud Drive-val az URLForUbiquityContainerIdentifier metóduson keresztül, amely visszaadja az iCloud könyvtár URL-jét az alkalmazás számára. A működéshez engedélyezni kell az iCloud capability-t a projektben, és hozzá kell adni a megfelelő entitlement-et.
Az iCloud fájlok automatikusan szinkronizálódnak, de a FileManager metódusokat biztosít a manuális vezérléshez: a startDownloadingUbiquitousItem kényszeríti a letöltés megkezdését, az evictUbiquitousItem törli a helyi másolatot, és az urlOfItem(at:) visszaadja a helyi URL-t az iCloud fájlhoz. Az NSMetadataQuery az iCloud-ban lévő fájlok keresésére szolgál.
Kritikus korlátozás: az iCloud Drive nem támogatott a Documents könyvtárban lévő fájlokhoz — csak az ubiquityContainer-ben lévő fájlokhoz. Ne próbálja szinkronizálni a Documents-t iCloud-on keresztül; ehhez használja az NSUbiquitousKeyValueStore-t kis adatmennyiségekhez vagy a Core Data-t CloudKit-tel összetett struktúrákhoz.
A FileManager-rel végzett műveletek költségesek lehetnek, különösen lassú flash memóriával rendelkező eszközökön. Az Apple fő ajánlásai közé tartozik az összes fájlművelet háttérsorokban történő végrehajtása, a fileExistsAtPath hívások számának minimalizálása és az eredmények gyorsítótárazásának használata.
A fileExists metódus egy rendszerhívást (stat()) hajt végre, amely viszonylag lassú. Ha egy fájl létezését ellenőrzi az olvasás előtt, jobb, ha azonnal megpróbálja olvasni és kezeli a hibát — ez ugyanazt a stat-ot hajtja végre, de kiküszöböli a dupla rendszerhívást. Tömeges ellenőrzésekhez használja az enumeratorAt-ot resourceValues paraméterrel.
A nagy adatmennyiségekkel való munka optimalizálásához:
Az Apple Instruments File Activity sablont biztosít a fájlműveletek profilozásához. Használja a szűk keresztmetszetek azonosításához — például gyakori fileExists hívások egy ciklusban vagy írási műveletek a fő szálon. A leggyakoribb teljesítményproblémák nagy fájlok szinkron írásához kapcsolódnak az alkalmazás minimalizálásakor.
Gyakran ismételt kérdések
FileManager — a Foundation keretrendszer osztálya az Apple fájlrendszerrel való munkához. API-t biztosít fájlok és könyvtárak létrehozásához, olvasásához, áthelyezéséhez, törléséhez. iOS-ben a működése az alkalmazás Sandbox-ának kereteire korlátozódik, kivéve a Security-Scoped Bookmarks-okat.
Documents — felhasználói adatok iCloud biztonsági mentéssel. Library/Caches — gyorsítótárak biztonsági mentés nélkül. Library/Application Support — adatbázisok. tmp — ideiglenes fájlok. App Group Container — azonos csoport alkalmazásai közötti megosztott adatokhoz.
Hívja meg a FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first-et. A metódus egy URL-t ad vissza a Documents könyvtár abszolút elérési útvonalával az aktuális alkalmazás Sandbox-án belül. A létezés ellenőrzéséhez használja a fileExists(atPath:)-t.
Nem, az iOS Sandbox tiltja a hozzáférést más alkalmazások fájlrendszeréhez. Kivételek: App Groups (megosztott könyvtár azonos fejlesztő alkalmazásai számára) és Security-Scoped Bookmarks (hozzáférés fájlokhoz UIDocumentPicker és iCloud Drive segítségével).
Íráskor használja a .atomic opciót — az adatok először egy ideiglenes fájlba kerülnek, majd atomi módon áthelyezésre kerülnek a célútvonalra. Ez megakadályozza a fájl sérülését írási hiba esetén. Nagy adatokhoz használja a FileHandle-t 1-2 MB-os darabokban történő írással.
Összefoglalás
Kulcsrakész mobilalkalmazást fejlesztünk
Az IT Sectr 2017 óta készít iOS és Android alkalmazásokat induló vállalkozásoknak és vállalkozásoknak. Tanácsot adunk, és a legjobb megoldást javasoljuk.
Olvassa el is