FileManager — nedir, iOS dosya sistemi ile çalışma

Yazar: IT Sectr Yayınlanma: 2026-07-09 Okuma süresi: 9 dk

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, dosya sistemi işlemleri için Foundation'ın ana sınıfıdır: dosyaları okuma, yazma, taşıma, silme.
  • Sandbox, FileManager erişimini yalnızca uygulama dizinleriyle sınırlar — Documents, Library, tmp ve App Group.
  • URL tabanlı API (fileManager.urls), modern uygulamalar için String tabanlıya (NSHomeDirectory) tercih edilir.
  • FileManagerDelegate, shouldMoveItemAt ve shouldRemoveItemAt aracılığıyla dosya işlemlerini izlemeye ve kontrol etmeye olanak tanır.
  • iCloud Drive, ubiquityContainer etkinleştirildiğinde ve uygun entitlement'lar ayarlandığında FileManager aracılığıyla kullanılabilir.

FileManager Nedir

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.

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

iOS Uygulamasının Ana Dizinleri

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.

DizinFileManager URLYedeklemeKullanım
Documents.documentDirectoryEvetKullanıcı verileri, dosyalar, dışa aktarma
Library/Caches.cachesDirectoryHayırGörsel önbellekleri, geçici veriler
Library/Preferences.libraryDirectory + "Preferences"EvetUserDefaults, uygulama ayarları
Library/Application Support.applicationSupportDirectoryEvetVeritabanları, CoreData, Realm
tmp.tmpDirectory (NSTemporaryDirectory)HayırGeç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.

Dosyaları Okuma ve Yazma

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.

swift
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.

Dizin Yönetimi

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.

swift
// 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 ve iCloud

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 Performansı

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:

  • Büyük dosyaların akışlı işlenmesi için FileHandle kullanın
  • Sık kullanılan dizinler için fileManager.urls sonuçlarını önbelleğe alın
  • Ana iş parçacığını bloke etmekten kaçınarak, ayrıntılı bir kuyrukta toplu işlemler gerçekleştirin
  • Birden çok iş parçacığından güvenli erişim için CoordinatedFileManager kullanın

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

iOS'ta FileManager nedir?

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.

iOS'ta FileManager aracılığıyla hangi dizinlere erişilebilir?

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 aracılığıyla Documents yoluna nasıl erişilir?

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.

FileManager aracılığıyla diğer uygulamaların dosyalarına erişebilir miyim?

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).

FileManager aracılığıyla dosyalar güvenli bir şekilde nasıl yazılır?

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

  • FileManager, iOS'ta varlık kontrolünden yinelemeli dizin dolaşmaya kadar tüm dosya sistemi işlemleri için Foundation'ın merkezi sınıfıdır.
  • Documents, Library, tmp — farklı yedekleme kuralları ve yaşam döngülerine sahip üç ana uygulama dizinidir.
  • URL tabanlı API, Sandbox ve Security-Scoped Bookmarks ile uyumluluk için String tabanlı yollara tercih edilir.
  • FileHandle ve akışlı işleme, bellek taşması olmadan büyük dosyalarla çalışmanın tek yoludur.
  • FileManagerDelegate, should-yöntemleri aracılığıyla taşıma, kopyalama ve silme işlemlerini kontrol etmeye olanak tanır.
  • iCloud entegrasyonu, bulut dosyalarıyla çalışmak için ubiquityContainer ve NSMetadataQuery aracılığıyla kullanılabilir.
  • Performans dosya işlemlerinde kritiktir — bunları arka plan kuyruklarında gerçekleştirin ve fileExists çağrılarını en aza indirin.

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.

Projeyi tartış

Ayrıca okuyun