FileManager — ce este, lucrul cu sistemul de fișiere iOS

Autor: IT Sectr Publicat: 2026-07-09 Timp de citire: 9 min

FileManager — este o clasă din framework-ul Foundation, care oferă o interfață pentru lucrul cu sistemul de fișiere iOS, macOS și alte platforme Apple. Permite crearea, citirea, mutarea și ștergerea fișierelor și directoarelor, precum și gestionarea metadatelor și a drepturilor de acces. În iOS, toate operațiile FileManager sunt limitate de Sandbox-ul aplicației. Conform Apple Developer Documentation (2026), FileManager este thread-safe și poate fi utilizat din firele de execuție de fundal, dar toate operațiile cu sistemul de fișiere trebuie efectuate ținând cont de sandbox și de drepturile de acces Security-Scoped Bookmarks.

Principalele puncte

  • FileManager — clasa principală Foundation pentru operații cu sistemul de fișiere: citire, scriere, mutare, ștergere fișiere.
  • Sandbox limitează accesul FileManager doar la directoarele aplicației — Documents, Library, tmp și App Group.
  • API bazat pe URL (fileManager.urls) este preferabil celui bazat pe String (NSHomeDirectory) pentru aplicațiile moderne.
  • FileManagerDelegate permite urmărirea și controlul operațiilor cu fișiere prin shouldMoveItemAt și shouldRemoveItemAt.
  • iCloud Drive este accesibil prin FileManager cu ubiquityContainer activat și entitlements corespunzătoare.

Ce este FileManager

FileManager — o clasă singleton din framework-ul Foundation, care oferă o API unificată pentru interacțiunea cu sistemul de fișiere pe toate platformele Apple. Este accesibil prin FileManager.default sau prin crearea unei instanțe cu un delegat personalizat.

Principalele capacități ale clasei includ: verificarea existenței fișierului (fileExists), crearea directoarelor (createDirectory), copierea și mutarea (copyItem, moveItem), ștergerea (removeItem), obținerea atributelor (attributesOfItem) și a conținutului directoarelor (contentsOfDirectory). FileManager este strâns legat de NSData, String și JSONEncoder/Decoder pentru serializarea datelor.

FileManager este thread-safe: Apple garantează siguranța apelării metodelor din diferite fire de execuție. Cu toate acestea, operațiile cu sistemul de fișiere pot fi lente pentru fișierele mari, de aceea Apple recomandă executarea lor pe o coadă de fundal (DispatchQueue.global) și apelarea metodelor FileManagerDelegate pentru informarea despre progres.

swift
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)")
}

Directoarele principale ale aplicației iOS

Fiecare aplicație iOS are trei directoare principale accesibile prin FileManager în cadrul Sandbox: Documents, Library și tmp. Fiecare are propriul scop și reguli de backup, a căror respectare este esențială pentru a trece de revizuirea App Store.

Documents — pentru datele utilizatorului care trebuie păstrate între porniri și copiate în iCloud. Library — pentru fișierele aplicației: cache-uri (Caches), setări (Preferences), baze de date (Application Support). tmp — pentru fișiere temporare care pot fi șterse de sistem în orice moment între pornirile aplicației.

DirectorURL FileManagerBackupUtilizare
Documents.documentDirectoryDaDate utilizator, fișiere, export
Library/Caches.cachesDirectoryNuCache-uri imagini, date temporare
Library/Preferences.libraryDirectory + "/Preferences"DaUserDefaults, setări aplicație
Library/Application Support.applicationSupportDirectoryDaBaze de date, CoreData, Realm
tmp.tmpDirectory (NSTemporaryDirectory)NuFișiere temporare de sesiune

Regula Apple: dacă un fișier poate fi restaurat din internet sau recreat — trebuie stocat în Caches (fără backup). Dacă fișierul conține date utilizator — Documents (cu backup). Plasarea incorectă a fișierelor este una dintre cauzele frecvente de respingere a aplicației, deoarece Apple verifică conformitatea cu ghidurile Storage & iCloud Backup Guidelines.

Citirea și scrierea fișierelor

FileManager însuși nu oferă metode pentru citirea conținutului fișierelor — pentru aceasta se folosesc NSData(contentsOf), String(contentsOf) sau metodele FileHandle. FileManager este responsabil pentru gestionarea fișierelor: verificarea existenței, mutarea, copierea, ștergerea.

Pentru scrierea datelor se utilizează metoda createFile(atPath:contents:attributes:) sau API-uri de nivel înalt — data.write(to:), JSONEncoder.encode și PropertyListEncoder. FileManager oferă, de asemenea, FileHandle pentru citirea și scrierea în flux a fișierelor mari, care nu încarcă întregul fișier în memorie.

swift
struct UserSettings: Codable {
    let username: String
    let isDarkMode: Bool
    let fontSize: Int
}

let settings = UserSettings(
    username: "developer",
    isDarkMode: true,
    fontSize: 16
)

// Scrie JSON în 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)

// Citește JSON
let loadedData = try Data(contentsOf: url)
let loadedSettings = try JSONDecoder()
    .decode(UserSettings.self, from: loadedData)

La scriere, utilizați options: .atomic — acest lucru garantează că fișierul nu va fi deteriorat în cazul unei erori de scriere: datele sunt mai întâi salvate într-un fișier temporar, apoi mutate atomic la calea țintă. Pentru citirea fișierelor mari, utilizați FileHandle cu .readingMode și citiți datele în bucăți, controlând consumul de memorie.

Gestionarea directoarelor

FileManager oferă metode pentru gestionarea completă a directoarelor: createDirectory (crearea tuturor folderelor intermediare prin withIntermediateDirectories), contentsOfDirectory (obținerea listei de fișiere), enumeratorAt (parcurgerea recursivă) și subpathsOfDirectory (toate căile din director).

Metoda enumeratorAt returnează un DirectoryEnumerator care permite parcurgerea eficientă a directoarelor mari fără încărcarea întregului conținut în memorie. Acesta suportă filtrarea prin skipDescendants și oferă atributele fiecărui element fără o interogare suplimentară a sistemului de fișiere.

swift
// Parcurgere recursivă a directoarelor
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")
        }
    }
}

Pentru ștergerea unui director, utilizați removeItem(at:). Atenție: ștergerea unui director în iOS este ireversibilă — fișierele nu ajung în coșul de gunoi, ca pe macOS. Înainte de ștergere, asigurați-vă că nu mai utilizați fișiere din acest director și efectuați operația pe un fir de execuție de fundal, deoarece ștergerea unui număr mare de fișiere poate bloca interfața.

FileManager și iCloud

FileManager se integrează cu iCloud Drive prin metoda URLForUbiquityContainerIdentifier, care returnează URL-ul directorului iCloud pentru aplicație. Pentru funcționare, este necesară activarea iCloud capability în proiect și adăugarea entitlement-ului corespunzător.

Fișierele iCloud se sincronizează automat, dar FileManager oferă metode pentru control manual: startDownloadingUbiquitousItem forțează începerea descărcării, evictUbiquitousItem șterge copia locală, iar urlOfItem(at:) returnează URL-ul local pentru fișierul iCloud. NSMetadataQuery este utilizat pentru căutarea fișierelor în iCloud.

Limitare critică: iCloud Drive nu este suportat pentru fișierele din directorul Documents — doar pentru fișierele din ubiquityContainer. Nu încercați să sincronizați Documents prin iCloud; pentru aceasta utilizați NSUbiquitousKeyValueStore pentru volume mici de date sau Core Data cu CloudKit pentru structuri complexe.

Performanța FileManager

Operațiile cu FileManager pot fi costisitoare, în special pe dispozitive cu memorie flash lentă. Recomandările principale Apple includ executarea tuturor operațiilor cu fișiere pe cozi de fundal, minimizarea numărului de apeluri fileExistsAtPath și utilizarea stocării în cache a rezultatelor.

Metoda fileExists execută un apel de sistem stat(), care este relativ lent. Dacă verificați existența unui fișier înainte de a-l citi, este mai bine să încercați direct să-l citiți și să gestionați eroarea — acest lucru execută același stat, dar elimină un apel de sistem dublu. Pentru verificări în masă, utilizați enumeratorAt cu resourceValues.

Pentru optimizarea lucrului cu volume mari de date:

  • Utilizați FileHandle pentru procesarea în flux a fișierelor mari
  • Stocați în cache rezultatele fileManager.urls pentru directoarele utilizate frecvent
  • Executați operațiile în loturi pe o coadă granulară, evitând blocarea thread-ului principal
  • Utilizați CoordinatedFileManager pentru acces sigur din mai multe fire de execuție

Apple Instruments oferă șablonul File Activity pentru profilarea operațiilor cu fișiere. Utilizați-l pentru identificarea blocajelor — de exemplu, apeluri frecvente ale fileExists într-o buclă sau operații de scriere pe thread-ul principal. Cele mai frecvente probleme de performanță sunt legate de scrierea sincronă a fișierelor mari la minimizarea aplicației.

Întrebări frecvente

Ce este FileManager în iOS?

FileManager — clasa framework-ului Foundation pentru lucrul cu sistemul de fișiere Apple. Oferă API pentru crearea, citirea, mutarea, ștergerea fișierelor și directoarelor. În iOS, activitatea sa este limitată de Sandbox-ul aplicației, cu excepția Security-Scoped Bookmarks.

Ce directoare sunt accesibile prin FileManager în iOS?

Documents — date utilizator cu backup în iCloud. Library/Caches — cache-uri fără backup. Library/Application Support — baze de date. tmp — fișiere temporare. App Group Container — pentru date partajate între aplicațiile aceluiași grup.

Cum obțin calea către Documents prin FileManager?

Apelați FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first. Metoda returnează un URL cu calea absolută către directorul Documents din Sandbox-ul aplicației curente. Pentru verificarea existenței, utilizați fileExists(atPath:).

Pot accesa fișierele altor aplicații prin FileManager?

Nu, Sandbox-ul iOS interzice accesul la sistemul de fișiere al altor aplicații. Excepții: App Groups (director partajat pentru aplicațiile aceluiași dezvoltator) și Security-Scoped Bookmarks (acces la fișiere prin UIDocumentPicker și iCloud Drive).

Cum scriu fișiere în siguranță prin FileManager?

Utilizați opțiunea .atomic la scriere — datele sunt mai întâi salvate într-un fișier temporar, apoi mutate atomic la calea țintă. Acest lucru previne deteriorarea fișierului în cazul unei erori de scriere. Pentru date mari, utilizați FileHandle cu scriere în bucăți de 1-2 MB.

Rezumat

  • FileManager — clasa centrală Foundation pentru toate operațiile cu sistemul de fișiere în iOS: de la verificarea existenței până la parcurgerea recursivă a directoarelor.
  • Documents, Library, tmp — trei directoare principale ale aplicației cu reguli diferite de backup și ciclu de viață.
  • API bazat pe URL este preferabil căilor bazate pe String pentru compatibilitatea cu Sandbox și Security-Scoped Bookmarks.
  • FileHandle și procesarea în flux — singura modalitate de a lucra cu fișiere mari fără a depăși memoria.
  • FileManagerDelegate permite controlul operațiilor de mutare, copiere și ștergere prin metodele should.
  • Integrarea iCloud este disponibilă prin ubiquityContainer și NSMetadataQuery pentru lucrul cu fișiere în cloud.
  • Performanța operațiilor cu fișiere este critică — executați-le pe cozi de fundal și minimizați apelurile fileExists.

Vom dezvolta o aplicație mobilă la cheie

IT Sectr creează aplicații iOS și Android pentru startup-uri și afaceri din 2017. Vă vom consilia și vă vom propune cea mai bună soluție.

Discutați proiectul

Citiți și