FileManager — چیست، کار با سیستم فایل iOS

نویسنده: IT Sectr منتشر شده: 2026-07-09 زمان مطالعه: 9 دقیقه

FileManager — کلاسی از فریمورک Foundation است که رابطی برای کار با سیستم فایل iOS، macOS و سایر پلتفرم‌های Apple فراهم می‌کند. این کلاس امکان ایجاد، خواندن، جابجایی و حذف فایل‌ها و دایرکتوری‌ها و همچنین مدیریت متادیتا و مجوزهای دسترسی را می‌دهد. در iOS تمام عملیات FileManager به محدوده Sandbox برنامه محدود شده است. به گزارش Apple Developer Documentation (2026)، FileManager thread-safe است و می‌تواند از threadهای پس‌زمینه استفاده شود، اما تمام عملیات سیستم فایل باید با در نظر گرفتن sandbox و مجوزهای دسترسی Security-Scoped Bookmarks انجام شوند.

نکات اصلی

  • FileManager — کلاس اصلی Foundation برای عملیات سیستم فایل: خواندن، نوشتن، جابجایی، حذف فایل‌ها.
  • Sandbox محدود می‌کند دسترسی FileManager را فقط به دایرکتوری‌های برنامه — Documents، Library، tmp و App Group.
  • API مبتنی بر URL (fileManager.urls) برای برنامه‌های مدرن بر String-based (NSHomeDirectory) ارجحیت دارد.
  • FileManagerDelegate امکان ردیابی و کنترل عملیات فایل را از طریق shouldMoveItemAt و shouldRemoveItemAt فراهم می‌کند.
  • iCloud Drive از طریق FileManager با ubiquityContainer فعال و entitlements مربوطه در دسترس است.

FileManager چیست

FileManager — کلاس singleton از فریمورک Foundation است که API یکپارچه‌ای برای تعامل با سیستم فایل در تمام پلتفرم‌های Apple فراهم می‌کند. از طریق FileManager.default یا با ایجاد یک نمونه با دلیگیت سفارشی قابل دسترسی است.

قابلیت‌های اصلی کلاس شامل: بررسی وجود فایل (fileExists)، ایجاد دایرکتوری (createDirectory)، کپی و جابجایی (copyItem، moveItem)، حذف (removeItem)، دریافت ویژگی‌ها (attributesOfItem) و محتویات دایرکتوری (contentsOfDirectory) است. FileManager برای سریالایز کردن داده‌ها با NSData، String و JSONEncoder/Decoder ارتباط نزدیک دارد.

FileManager thread-safe است: Apple ایمنی فراخوانی متدها از threadهای مختلف را تضمین می‌کند. با این حال، عملیات سیستم فایل ممکن است روی فایل‌های بزرگ کند باشند، بنابراین Apple توصیه می‌کند آنها را در صف پس‌زمینه (DispatchQueue.global) اجرا کرده و متدهای FileManagerDelegate را برای اطلاع از پیشرفت فراخوانی کنید.

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

هر برنامه iOS دارای سه دایرکتوری اصلی است که از طریق FileManager در چارچوب Sandbox قابل دسترسی هستند: Documents، Library و tmp. هر کدام هدف و قوانین پشتیبان‌گیری خاص خود را دارند که رعایت آنها برای قبولی در بازبینی App Store حیاتی است.

Documents — برای داده‌های کاربر که باید بین راه‌اندازی‌ها حفظ شوند و در iCloud پشتیبان‌گیری شوند. Library — برای فایل‌های برنامه: کش‌ها (Caches)، تنظیمات (Preferences)، پایگاه‌های داده (Application Support). tmp — برای فایل‌های موقتی که ممکن است توسط سیستم در هر لحظه بین راه‌اندازی‌های برنامه حذف شوند.

دایرکتوریURL FileManagerپشتیبان‌گیریکاربرد
Documents.documentDirectoryبلهداده‌های کاربر، فایل‌ها، خروجی
Library/Caches.cachesDirectoryخیرکش تصاویر، داده‌های موقت
Library/Preferences.libraryDirectory + "/Preferences"بلهUserDefaults، تنظیمات برنامه
Library/Application Support.applicationSupportDirectoryبلهپایگاه‌های داده، CoreData، Realm
tmp.tmpDirectory (NSTemporaryDirectory)خیرفایل‌های موقت جلسه

قانون Apple: اگر فایل را می‌توان از اینترنت بازیابی یا دوباره ایجاد کرد — باید در Caches ذخیره شود (بدون پشتیبان‌گیری). اگر فایل حاوی داده‌های کاربر است — Documents (با پشتیبان‌گیری). قرار دادن نادرست فایل‌ها یکی از دلایل رایج رد برنامه است، زیرا Apple سازگاری با Storage & iCloud Backup Guidelines را بررسی می‌کند.

خواندن و نوشتن فایل‌ها

FileManager خود متدهایی برای خواندن محتوای فایل‌ها فراهم نمی‌کند — برای این کار از NSData(contentsOf)، String(contentsOf) یا متدهای FileHandle استفاده می‌شود. FileManager مسئول مدیریت فایل‌ها است: بررسی وجود، جابجایی، کپی، حذف.

برای نوشتن داده‌ها از متد createFile(atPath:contents:attributes:) یا APIهای سطح بالا — data.write(to:)، JSONEncoder.encode و PropertyListEncoder استفاده می‌شود. FileManager همچنین FileHandle را برای خواندن و نوشتن جریانی فایل‌های بزرگ فراهم می‌کند که کل فایل را در حافظه بارگذاری نمی‌کند.

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

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

// نوشتن JSON در 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)

// خواندن JSON
let loadedData = try Data(contentsOf: url)
let loadedSettings = try JSONDecoder()
    .decode(UserSettings.self, from: loadedData)

هنگام نوشتن از options: .atomic استفاده کنید — این تضمین می‌کند که فایل در صورت خرابی نوشتن آسیب نبیند: داده‌ها ابتدا در یک فایل موقت ذخیره می‌شوند، سپس به صورت اتمی به مسیر مقصد منتقل می‌شوند. برای خواندن فایل‌های بزرگ از FileHandle با .readingMode استفاده کنید و داده‌ها را به صورت تکه‌تکه بخوانید و مصرف حافظه را کنترل کنید.

مدیریت دایرکتوری‌ها

FileManager متدهایی برای مدیریت کامل دایرکتوری‌ها فراهم می‌کند: createDirectory (ایجاد همه پوشه‌های میانی با withIntermediateDirectories)، contentsOfDirectory (دریافت لیست فایل‌ها)، enumeratorAt (پیمایش بازگشتی) و subpathsOfDirectory (همه مسیرهای داخل دایرکتوری).

متد enumeratorAt یک DirectoryEnumerator برمی‌گرداند که امکان پیمایش کارآمد دایرکتوری‌های بزرگ را بدون بارگذاری کل محتوا در حافظه فراهم می‌کند. این متد از فیلتر کردن از طریق skipDescendants پشتیبانی می‌کند و ویژگی‌های هر عنصر را بدون درخواست اضافی به سیستم فایل ارائه می‌دهد.

swift
// پیمایش بازگشتی دایرکتوری
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")
        }
    }
}

برای حذف دایرکتوری از removeItem(at:) استفاده کنید. توجه: حذف دایرکتوری در iOS غیرقابل بازگشت است — فایل‌ها مانند macOS به سطل زباله نمی‌روند. قبل از حذف مطمئن شوید که دیگر از فایل‌های این دایرکتوری استفاده نمی‌کنید و عملیات را در thread پس‌زمینه اجرا کنید، زیرا حذف تعداد زیادی فایل ممکن است UI را مسدود کند.

FileManager و iCloud

FileManager از طریق متد URLForUbiquityContainerIdentifier با iCloud Drive یکپارچه می‌شود که URL دایرکتوری iCloud برنامه را برمی‌گرداند. برای کار نیاز به فعال کردن iCloud capability در پروژه و افزودن entitlement مربوطه است.

فایل‌های iCloud به صورت خودکار همگام‌سازی می‌شوند، اما FileManager متدهایی برای کنترل دستی فراهم می‌کند: startDownloadingUbiquitousItem دانلود را اجباری شروع می‌کند، evictUbiquitousItem کپی محلی را حذف می‌کند، و urlOfItem(at:) URL محلی فایل iCloud را برمی‌گرداند. NSMetadataQuery برای جستجوی فایل‌ها در iCloud استفاده می‌شود.

محدودیت بحرانی: iCloud Drive برای فایل‌های موجود در دایرکتوری Documents پشتیبانی نمی‌شود — فقط برای فایل‌های موجود در ubiquityContainer. سعی نکنید Documents را از طریق iCloud همگام‌سازی کنید؛ برای این کار از NSUbiquitousKeyValueStore برای حجم‌های کوچک داده یا Core Data با CloudKit برای ساختارهای پیچیده استفاده کنید.

عملکرد FileManager

عملیات FileManager ممکن است پرهزینه باشند، به خصوص در دستگاه‌هایی با حافظه flash کند. توصیه‌های اصلی Apple شامل اجرای تمام عملیات فایل در صف‌های پس‌زمینه، به حداقل رساندن تعداد فراخوانی‌های fileExistsAtPath و استفاده از ذخیره‌سازی نتایج است.

متد fileExists فراخوانی سیستمی stat() را انجام می‌دهد که نسبتاً کند است. اگر وجود فایل را قبل از خواندن آن بررسی می‌کنید، بهتر است مستقیماً آن را بخوانید و خطا را مدیریت کنید — این همان stat را انجام می‌دهد اما از فراخوانی سیستمی مضاعف جلوگیری می‌کند. برای بررسی‌های انبوه از enumeratorAt با resourceValues استفاده کنید.

برای بهینه‌سازی کار با حجم‌های زیاد داده:

  • برای پردازش جریانی فایل‌های بزرگ از FileHandle استفاده کنید
  • نتایج fileManager.urls را برای دایرکتوری‌های پرکاربرد ذخیره کنید
  • عملیات دسته‌ای را در صف دانه‌بندی شده اجرا کنید و از مسدود کردن main thread خودداری کنید
  • برای دسترسی امن از چند thread از CoordinatedFileManager استفاده کنید

Apple Instruments الگوی File Activity را برای پروفایل عملیات فایل فراهم می‌کند. از آن برای شناسایی تنگناها استفاده کنید — مثلاً فراخوانی‌های مکرر fileExists در حلقه یا عملیات نوشتن در main thread. رایج‌ترین مشکلات عملکرد مربوط به نوشتن همزمان فایل‌های بزرگ هنگام جمع‌شدن برنامه است.

سوالات متداول

FileManager در iOS چیست؟

FileManager — کلاس فریمورک Foundation برای کار با سیستم فایل Apple است. API برای ایجاد، خواندن، جابجایی، حذف فایل‌ها و دایرکتوری‌ها فراهم می‌کند. در iOS عملکرد آن به محدوده Sandbox برنامه محدود است، به جز Security-Scoped Bookmarks.

چه دایرکتوری‌هایی از طریق FileManager در iOS قابل دسترسی هستند؟

Documents — داده‌های کاربر با پشتیبان‌گیری در iCloud. Library/Caches — کش‌های بدون پشتیبان‌گیری. Library/Application Support — پایگاه‌های داده. tmp — فایل‌های موقت. App Group Container — برای داده‌های مشترک بین برنامه‌های یک گروه.

چگونه مسیر Documents را از طریق FileManager دریافت کنیم؟

FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first را فراخوانی کنید. متد URL با مسیر مطلق دایرکتوری Documents در Sandbox برنامه جاری برمی‌گرداند. برای بررسی وجود از fileExists(atPath:) استفاده کنید.

آیا می‌توان از طریق FileManager به فایل‌های سایر برنامه‌ها دسترسی داشت؟

خیر، Sandbox iOS دسترسی به سیستم فایل سایر برنامه‌ها را ممنوع می‌کند. استثناها: App Groups (دایرکتوری مشترک برای برنامه‌های یک توسعه‌دهنده) و Security-Scoped Bookmarks (دسترسی به فایل‌ها از طریق UIDocumentPicker و iCloud Drive).

چگونه فایل‌ها را از طریق FileManager ایمن بنویسیم؟

هنگام نوشتن از گزینه .atomic استفاده کنید — داده‌ها ابتدا در یک فایل موقت ذخیره می‌شوند، سپس به صورت اتمی به مسیر مقصد منتقل می‌شوند. این از آسیب دیدن فایل در صورت خرابی نوشتن جلوگیری می‌کند. برای داده‌های بزرگ از FileHandle با نوشتن تکه‌های ۱-۲ مگابایتی استفاده کنید.

خلاصه

  • FileManager — کلاس مرکزی Foundation برای تمام عملیات سیستم فایل در iOS: از بررسی وجود تا پیمایش بازگشتی دایرکتوری‌ها.
  • Documents, Library, tmp — سه دایرکتوری اصلی برنامه با قوانین مختلف پشتیبان‌گیری و چرخه عمر.
  • API مبتنی بر URL برای سازگاری با Sandbox و Security-Scoped Bookmarks بر مسیرهای String-based ارجحیت دارد.
  • FileHandle و پردازش جریانی — تنها راه کار با فایل‌های بزرگ بدون سرریز حافظه.
  • FileManagerDelegate امکان کنترل عملیات جابجایی، کپی و حذف را از طریق should-متدها فراهم می‌کند.
  • یکپارچه‌سازی iCloud از طریق ubiquityContainer و NSMetadataQuery برای کار با فایل‌های ابری در دسترس است.
  • عملکرد عملیات فایل حیاتی است — آنها را در صف‌های پس‌زمینه اجرا کنید و فراخوانی‌های fileExists را به حداقل برسانید.

ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد

IT Sectr از سال 2017 برنامه‌های iOS و Android را برای استارتاپ‌ها و کسب‌وکارها ایجاد می‌کند. ما به شما مشاوره می‌دهیم و بهترین راه‌حل را پیشنهاد خواهیم کرد.

بحث درباره پروژه

همچنین بخوانید