FileManager, iOS, macOS ve diğer Apple platformlarında dosya sistemi ile çalışmak için bir arayüz sağlayan Foundation framework'ünden bir sınıftır. Dosya ve dizinler oluşturma, okuma, taşıma ve silmenin yanı sıra meta veri ve erişim izinlerini yönetmeye olanak tanır. iOS'ta tüm FileManager işlemleri uygulama Sandbox'ı ile sınırlıdır. Apple Geliştirici Dokümantasyonu'na (2026) göre FileManager iş parçacığı güvenlidir ve arka plan iş parçacıklarından kullanılabilir, ancak tüm dosya sistemi işlemleri sandbox ve Security-Scoped Bookmarks erişim izinleri dikkate alınarak gerçekleştirilmelidir.
Önemli Noktalar
FileManager, tüm Apple platformlarında dosya sistemiyle etkileşim için birleşik bir API sağlayan Foundation framework'ünün bir singleton sınıfıdır. FileManager.default aracılığıyla veya özel bir temsilci ile bir örnek oluşturarak kullanılabilir.
Sınıfın temel yetenekleri şunları içerir: dosya varlığını kontrol etme (fileExists), dizin oluşturma (createDirectory), kopyalama ve taşıma (copyItem, moveItem), silme (removeItem), öznitelikleri alma (attributesOfItem) ve dizin içeriklerini alma (contentsOfDirectory). FileManager, veri serileştirme için NSData, String ve JSONEncoder/Decoder ile yakından ilişkilidir.
FileManager iş parçacığı güvenlidir: Apple, farklı iş parçacıklarından güvenli yöntem çağrılarını garanti eder. Ancak, dosya sistemi işlemleri büyük dosyalarda yavaş olabilir, bu nedenle Apple bunların arka plan kuyruğunda (DispatchQueue.global) yapılmasını ve ilerlemeyi bildirmek için FileManagerDelegate yöntemlerinin çağrılmasını önerir.
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)")
}
Her iOS uygulamasının Sandbox içinde FileManager aracılığıyla erişilebilen üç ana dizini vardır: Documents, Library ve tmp. Her birinin kendi amacı ve App Store incelemesini geçmek için uyulması kritik olan yedekleme kuralları vardır.
Documents — başlatmalar arasında kalıcı olması ve iCloud'a yedeklenmesi gereken kullanıcı verileri için. Library — uygulama dosyaları için: önbellekler (Caches), ayarlar (Preferences), veritabanları (Application Support). tmp — sistem tarafından uygulama başlatmaları arasında herhangi bir zamanda silinebilen geçici dosyalar için.
| Dizin | FileManager URL | Yedekleme | Kullanım |
|---|---|---|---|
| Documents | .documentDirectory | Evet | Kullanıcı verileri, dosyalar, dışa aktarma |
| Library/Caches | .cachesDirectory | Hayır | Görsel önbellekleri, geçici veriler |
| Library/Preferences | .libraryDirectory + "Preferences" | Evet | UserDefaults, uygulama ayarları |
| Library/Application Support | .applicationSupportDirectory | Evet | Veritabanları, CoreData, Realm |
| tmp | .tmpDirectory (NSTemporaryDirectory) | Hayır | Geçici oturum dosyaları |
Apple kuralı: bir dosya internetten kurtarılabiliyor veya yeniden oluşturulabiliyorsa — Caches'te saklanmalıdır (yedeklemesiz). Bir dosya kullanıcı verisi içeriyorsa — Documents (yedeklemeli). Yanlış dosya yerleşimi, uygulama reddinin yaygın nedenlerinden biridir, çünkü Apple Storage ve iCloud Backup Yönergelerine uyumu kontrol eder.
FileManager'ın kendisi dosya içeriklerini okumak için yöntem sağlamaz — bunun için NSData(contentsOf), String(contentsOf) veya FileHandle yöntemlerini kullanın. FileManager, dosyaların yönetiminden sorumludur: varlık kontrolü, taşıma, kopyalama, silme.
Veri yazmak için createFile(atPath:contents:attributes:) yöntemini veya üst düzey API'leri — data.write(to:), JSONEncoder.encode ve PropertyListEncoder kullanın. FileManager ayrıca büyük dosyaların akışlı okuma ve yazması için FileHandle sağlar, bu dosyanın tamamını belleğe yüklemez.
struct UserSettings: Codable {
let username: String
let isDarkMode: Bool
let fontSize: Int
}
let settings = UserSettings(
username: "developer",
isDarkMode: true,
fontSize: 16
)
// JSON'u Documents'a yaz
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'u oku
let loadedData = try Data(contentsOf: url)
let loadedSettings = try JSONDecoder()
.decode(UserSettings.self, from: loadedData)
Yazarken options: .atomic kullanın — bu, yazma başarısız olursa dosyanın bozulmayacağını garanti eder: veriler önce geçici bir dosyaya kaydedilir, ardından atomik olarak hedef yola taşınır. Büyük dosyaları okumak için .readingMode ile FileHandle kullanın ve bellek tüketimini kontrol ederek verileri parçalar halinde okuyun.
FileManager, tam dizin yönetimi için yöntemler sağlar: createDirectory (withIntermediateDirectories aracılığıyla tüm ara klasörleri oluşturma), contentsOfDirectory (dosya listesi alma), enumeratorAt (yinelemeli dolaşma) ve subpathsOfDirectory (bir dizin içindeki tüm yollar).
enumeratorAt yöntemi, tüm içeriği belleğe yüklemeden büyük dizinleri verimli bir şekilde dolaşmaya olanak tanıyan bir DirectoryEnumerator döndürür. skipDescendants aracılığıyla filtrelemeyi destekler ve ek bir dosya sistemi sorgusu olmadan her öğenin özniteliklerini sağlar.
// Yinelemeli dizin dolaşma
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")
}
}
}
Bir dizini silmek için removeItem(at:) kullanın. Uyarı: iOS'ta bir dizini silmek geri alınamaz — dosyalar macOS'taki gibi çöp kutusuna gitmez. Silmeden önce, o dizindeki dosyalara artık ihtiyacınız olmadığından emin olun ve işlemi arka plan iş parçacığında gerçekleştirin, çünkü çok sayıda dosyayı silmek kullanıcı arayüzünü bloke edebilir.
FileManager, URLForUbiquityContainerIdentifier yöntemi aracılığıyla iCloud Drive ile entegre olur ve uygulama için iCloud dizininin URL'sini döndürür. Bu, projede iCloud yeteneğinin etkinleştirilmesini ve uygun entitlement'ın eklenmesini gerektirir.
iCloud dosyaları otomatik olarak senkronize olur, ancak FileManager manuel kontrol için yöntemler sağlar: startDownloadingUbiquitousItem indirmeyi zorlar, evictUbiquitousItem yerel kopyayı kaldırır ve urlOfItem(at:) bir iCloud dosyası için yerel URL'yi döndürür. NSMetadataQuery, iCloud'da dosya aramak için kullanılır.
Kritik sınırlama: iCloud Drive, Documents dizinindeki dosyalar için desteklenmez — yalnızca ubiquityContainer'daki dosyalar için. Documents'ı iCloud aracılığıyla senkronize etmeye çalışmayın; bunun için küçük veri miktarları için NSUbiquitousKeyValueStore veya karmaşık yapılar için CloudKit ile Core Data kullanın.
FileManager işlemleri, özellikle yavaş flash belleğe sahip cihazlarda pahalı olabilir. Apple'ın ana önerileri, tüm dosya işlemlerinin arka plan kuyruklarında yapılmasını, fileExistsAtPath çağrılarının en aza indirilmesini ve sonuçların önbelleğe alınmasını içerir.
fileExists yöntemi, nispeten yavaş olan bir stat() sistem çağrısı gerçekleştirir. Okumadan önce dosyanın varlığını kontrol ediyorsanız, doğrudan okumayı denemek ve hatayı işlemek daha iyidir — bu aynı stat'ı gerçekleştirir ancak çift sistem çağrısını önler. Toplu kontroller için resourceValues ile enumeratorAt kullanın.
Büyük veri hacimleriyle çalışmayı optimize etmek için:
Apple Instruments, dosya işlemlerini profil oluşturmak için File Activity şablonu sağlar. Darboğazları belirlemek için kullanın — örneğin, bir döngüde sık fileExists çağrıları veya ana iş parçacığında yazma işlemleri. En yaygın performans sorunları, uygulama askıya alındığında büyük dosyaların senkronize yazılmasıyla ilgilidir.
Sık Sorulan Sorular
FileManager, Apple dosya sistemiyle çalışmak için Foundation framework'ünün bir sınıfıdır. Dosya ve dizinler oluşturma, okuma, taşıma ve silme için API sağlar. iOS'ta, çalışması Security-Scoped Bookmarks dışında uygulama Sandbox'ı ile sınırlıdır.
Documents — iCloud yedeklemeli kullanıcı verileri. Library/Caches — yedeklemesiz önbellekler. Library/Application Support — veritabanları. tmp — geçici dosyalar. App Group Container — aynı gruptaki uygulamalar arasında paylaşılan veriler için.
FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first öğesini çağırın. Yöntem, geçerli uygulamanın Sandbox'ı içindeki Documents dizinine mutlak yolu içeren bir URL döndürür. Varlık kontrolü için fileExists(atPath:) kullanın.
Hayır, iOS Sandbox'ı diğer uygulamaların dosya sistemine erişimi engeller. İstisnalar: App Groups (aynı geliştiricinin uygulamaları için paylaşılan dizin) ve Security-Scoped Bookmarks (UIDocumentPicker ve iCloud Drive aracılığıyla dosya erişimi).
Yazarken .atomic seçeneğini kullanın — veriler önce geçici bir dosyaya kaydedilir, ardından atomik olarak hedef yola taşınır. Bu, yazma hatası durumunda dosyanın bozulmasını önler. Büyük veriler için, 1-2 MB'lık parçalar halinde yazma ile FileHandle kullanın.
Özet
Anahtar teslim bir mobil uygulama geliştireceğiz
IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.
Ayrıca okuyun