FileManager — adalah kelas dari framework Foundation yang menyediakan antarmuka untuk bekerja dengan sistem file iOS, macOS, dan platform Apple lainnya. Ini memungkinkan untuk membuat, membaca, memindahkan, dan menghapus file serta direktori, serta mengelola metadata dan hak akses. Di iOS, semua operasi FileManager dibatasi oleh Sandbox aplikasi. Menurut Apple Developer Documentation (2026), FileManager bersifat thread-safe dan dapat digunakan dari thread latar belakang, tetapi semua operasi sistem file harus dilakukan dengan mempertimbangkan sandbox dan hak akses Security-Scoped Bookmarks.
Poin utama
FileManager — kelas singleton dari framework Foundation yang menyediakan API terpadu untuk interaksi dengan sistem file di semua platform Apple. Dapat diakses melalui FileManager.default atau dengan membuat instance dengan delegasi kustom.
Kemampuan utama kelas ini meliputi: memeriksa keberadaan file (fileExists), membuat direktori (createDirectory), menyalin dan memindahkan (copyItem, moveItem), menghapus (removeItem), mendapatkan atribut (attributesOfItem) dan isi direktori (contentsOfDirectory). FileManager terkait erat dengan NSData, String, dan JSONEncoder/Decoder untuk serialisasi data.
FileManager bersifat thread-safe: Apple menjamin keamanan pemanggilan metode dari thread yang berbeda. Namun, operasi sistem file bisa lambat pada file besar, oleh karena itu Apple merekomendasikan untuk menjalankannya di antrian latar belakang (DispatchQueue.global) dan memanggil metode FileManagerDelegate untuk memberi informasi tentang kemajuan.
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)")
}
Setiap aplikasi iOS memiliki tiga direktori utama yang dapat diakses melalui FileManager dalam Sandbox: Documents, Library, dan tmp. Masing-masing memiliki tujuan dan aturan pencadangan sendiri, yang kepatuhannya sangat penting untuk lulus peninjauan App Store.
Documents — untuk data pengguna yang harus dipertahankan antar peluncuran dan dicadangkan ke iCloud. Library — untuk file aplikasi: cache (Caches), pengaturan (Preferences), basis data (Application Support). tmp — untuk file sementara yang dapat dihapus oleh sistem kapan saja di antara peluncuran aplikasi.
| Direktori | URL FileManager | Cadangan | Penggunaan |
|---|---|---|---|
| Documents | .documentDirectory | Ya | Data pengguna, file, ekspor |
| Library/Caches | .cachesDirectory | Tidak | Cache gambar, data sementara |
| Library/Preferences | .libraryDirectory + "/Preferences" | Ya | UserDefaults, pengaturan aplikasi |
| Library/Application Support | .applicationSupportDirectory | Ya | Basis data, CoreData, Realm |
| tmp | .tmpDirectory (NSTemporaryDirectory) | Tidak | File sementara sesi |
Aturan Apple: jika file dapat dipulihkan dari internet atau dibuat ulang — harus disimpan di Caches (tanpa cadangan). Jika file berisi data pengguna — Documents (dengan cadangan). Penempatan file yang salah adalah salah satu alasan umum penolakan aplikasi, karena Apple memeriksa kepatuhan terhadap Storage & iCloud Backup Guidelines.
FileManager sendiri tidak menyediakan metode untuk membaca konten file — untuk itu digunakan NSData(contentsOf), String(contentsOf), atau metode FileHandle. FileManager bertanggung jawab untuk mengelola file: memeriksa keberadaan, memindahkan, menyalin, menghapus.
Untuk menulis data, digunakan metode createFile(atPath:contents:attributes:) atau API tingkat tinggi — data.write(to:), JSONEncoder.encode, dan PropertyListEncoder. FileManager juga menyediakan FileHandle untuk membaca dan menulis file besar secara streaming, yang tidak memuat seluruh file ke dalam memori.
struct UserSettings: Codable {
let username: String
let isDarkMode: Bool
let fontSize: Int
}
let settings = UserSettings(
username: "developer",
isDarkMode: true,
fontSize: 16
)
// Tulis JSON ke 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)
// Baca JSON
let loadedData = try Data(contentsOf: url)
let loadedSettings = try JSONDecoder()
.decode(UserSettings.self, from: loadedData)
Saat menulis, gunakan options: .atomic — ini menjamin bahwa file tidak akan rusak jika terjadi kegagalan penulisan: data pertama kali disimpan ke file sementara, kemudian dipindahkan secara atomik ke jalur tujuan. Untuk membaca file besar, gunakan FileHandle dengan .readingMode dan baca data dalam potongan, kontrol penggunaan memori.
FileManager menyediakan metode untuk manajemen direktori lengkap: createDirectory (membuat semua folder perantara melalui withIntermediateDirectories), contentsOfDirectory (mendapatkan daftar file), enumeratorAt (penelusuran rekursif), dan subpathsOfDirectory (semua jalur dalam direktori).
Metode enumeratorAt mengembalikan DirectoryEnumerator yang memungkinkan penelusuran direktori besar secara efisien tanpa memuat seluruh konten ke dalam memori. Ini mendukung pemfilteran melalui skipDescendants dan menyediakan atribut setiap elemen tanpa kueri tambahan ke sistem file.
// Penelusuran direktori rekursif
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")
}
}
}
Untuk menghapus direktori, gunakan removeItem(at:). Perhatian: penghapusan direktori di iOS tidak dapat dibatalkan — file tidak masuk ke tempat sampah seperti di macOS. Sebelum menghapus, pastikan Anda tidak lagi menggunakan file dari direktori ini, dan lakukan operasi di thread latar belakang, karena menghapus banyak file dapat memblokir UI.
FileManager terintegrasi dengan iCloud Drive melalui metode URLForUbiquityContainerIdentifier, yang mengembalikan URL direktori iCloud untuk aplikasi. Untuk bekerja, diperlukan mengaktifkan iCloud capability di proyek dan menambahkan entitlement yang sesuai.
File iCloud disinkronkan secara otomatis, tetapi FileManager menyediakan metode untuk kontrol manual: startDownloadingUbiquitousItem memaksa memulai unduhan, evictUbiquitousItem menghapus salinan lokal, dan urlOfItem(at:) mengembalikan URL lokal untuk file iCloud. NSMetadataQuery digunakan untuk mencari file di iCloud.
Batasan kritis: iCloud Drive tidak didukung untuk file di direktori Documents — hanya untuk file di ubiquityContainer. Jangan mencoba menyinkronkan Documents melalui iCloud; untuk ini gunakan NSUbiquitousKeyValueStore untuk volume data kecil atau Core Data dengan CloudKit untuk struktur kompleks.
Operasi dengan FileManager bisa mahal, terutama pada perangkat dengan memori flash lambat. Rekomendasi utama Apple mencakup menjalankan semua operasi file di antrian latar belakang, meminimalkan jumlah panggilan fileExistsAtPath, dan menggunakan caching hasil.
Metode fileExists melakukan panggilan sistem stat(), yang relatif lambat. Jika Anda memeriksa keberadaan file sebelum membacanya, lebih baik langsung mencoba membacanya dan menangani kesalahan — ini melakukan stat yang sama, tetapi menghilangkan panggilan sistem ganda. Untuk pemeriksaan massal, gunakan enumeratorAt dengan resourceValues.
Untuk mengoptimalkan pekerjaan dengan volume data besar:
Apple Instruments menyediakan templat File Activity untuk pembuatan profil operasi file. Gunakan untuk mengidentifikasi hambatan — misalnya, panggilan fileExists yang sering dalam loop atau operasi penulisan di main thread. Masalah kinerja yang paling umum terkait dengan penulisan sinkron file besar saat aplikasi diminimalkan.
Pertanyaan yang sering diajukan
FileManager — kelas framework Foundation untuk bekerja dengan sistem file Apple. Menyediakan API untuk membuat, membaca, memindahkan, menghapus file dan direktori. Di iOS, kerjanya dibatasi oleh Sandbox aplikasi, kecuali Security-Scoped Bookmarks.
Documents — data pengguna dengan cadangan di iCloud. Library/Caches — cache tanpa cadangan. Library/Application Support — basis data. tmp — file sementara. App Group Container — untuk data bersama antar aplikasi dalam satu grup.
Panggil FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first. Metode mengembalikan URL dengan jalur absolut ke direktori Documents di dalam Sandbox aplikasi saat ini. Untuk memeriksa keberadaan, gunakan fileExists(atPath:).
Tidak, Sandbox iOS melarang akses ke sistem file aplikasi lain. Pengecualian: App Groups (direktori bersama untuk aplikasi pengembang yang sama) dan Security-Scoped Bookmarks (akses ke file melalui UIDocumentPicker dan iCloud Drive).
Gunakan opsi .atomic saat menulis — data pertama kali disimpan ke file sementara, kemudian dipindahkan secara atomik ke jalur tujuan. Ini mencegah kerusakan file jika terjadi kegagalan penulisan. Untuk data besar, gunakan FileHandle dengan penulisan dalam potongan 1-2 MB.
Ringkasan
Kami akan mengembangkan aplikasi seluler turnkey
IT Sectr membuat aplikasi iOS dan Android untuk startup dan bisnis sejak 2017. Kami akan memberi saran dan mengusulkan solusi terbaik.
Baca juga