FileManager — ما هو، العمل مع نظام ملفات iOS

المؤلف: IT Sectr نُشر: 2026-07-09 وقت القراءة: 9 دق

FileManager هو كلاس من إطار Foundation يوفر واجهة للعمل مع نظام الملفات في iOS وmacOS ومنصات Apple الأخرى. يتيح لك إنشاء وقراءة ونقل وحذف الملفات والدلائل، بالإضافة إلى إدارة البيانات الوصفية وأذونات الوصول. في iOS، جميع عمليات FileManager مقيدة بـ Sandbox التطبيق. وفقًا لـ توثيق Apple للمطورين (2026)، FileManager آمن للخيوط ويمكن استخدامه من خيوط الخلفية، ولكن جميع عمليات نظام الملفات يجب أن تتم مع مراعاة وضع الحماية وأذونات الوصول لـ Security-Scoped Bookmarks.

الخلاصة

  • FileManager هو الكلاس الرئيسي في Foundation لعمليات نظام الملفات: القراءة والكتابة والنقل وحذف الملفات.
  • Sandbox يقيد وصول FileManager إلى دلائل التطبيق فقط: Documents وLibrary وtmp وApp Group.
  • API القائم على URL (fileManager.urls) أفضل من القائم على String (NSHomeDirectory) للتطبيقات الحديثة.
  • FileManagerDelegate يسمح بتتبع والتحكم في عمليات الملفات من خلال shouldMoveItemAt وshouldRemoveItemAt.
  • iCloud Drive متاح عبر FileManager عند تمكين ubiquityContainer وتعيين التصاريح المناسبة.

ما هو FileManager

FileManager هو كلاس singleton من إطار Foundation يوفر API موحد للتفاعل مع نظام الملفات على جميع منصات Apple. متاح عبر FileManager.default أو عبر إنشاء مثيل بمفوض مخصص.

تشمل القدرات الرئيسية للكلاس: التحقق من وجود الملف (fileExists)، إنشاء الدلائل (createDirectory)، النسخ والنقل (copyItem، moveItem)، الحذف (removeItem)، الحصول على السمات (attributesOfItem) ومحتويات الدلائل (contentsOfDirectory). يرتبط FileManager ارتباطًا وثيقًا بـ NSData وString وJSONEncoder/Decoder لتسلسل البيانات.

FileManager آمن للخيوط: تضمن Apple استدعاءات آمنة للطرق من خيوط مختلفة. ومع ذلك، يمكن أن تكون عمليات نظام الملفات بطيئة على الملفات الكبيرة، لذلك توصي 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 من الامتثال لإرشادات التخزين والنسخ الاحتياطي لـ iCloud.

قراءة وكتابة الملفات

FileManager نفسه لا يوفر طرقًا لقراءة محتويات الملفات — لهذا استخدم NSData(contentsOf) أو String(contentsOf) أو طرق FileHandle. FileManager مسؤول عن إدارة الملفات: التحقق من الوجود، النقل، النسخ، الحذف.

لكتابة البيانات استخدم طريقة createFile(atPath:contents:attributes:) أو APIs عالية المستوى — 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. قبل الحذف، تأكد من أنك لم تعد بحاجة للملفات من هذا الدليل، وقم بتنفيذ العملية على خيط خلفية، حيث أن حذف العديد من الملفات قد يحظر واجهة المستخدم.

FileManager وiCloud

FileManager يتكامل مع iCloud Drive من خلال طريقة URLForUbiquityContainerIdentifier، التي تُرجع URL دليل iCloud للتطبيق. يتطلب ذلك تمكين إمكانية iCloud في المشروع وإضافة التصريح المناسب.

ملفات iCloud تتم مزامنتها تلقائيًا، لكن FileManager يوفر طرقًا للتحكم اليدوي: startDownloadingUbiquitousItem يفرض التحميل، evictUbiquitousItem يزيل النسخة المحلية، وurlOfItem(at:) يُرجع URL المحلي لملف iCloud. يستخدم NSMetadataQuery للبحث عن الملفات في iCloud.

قيود حرجة: iCloud Drive غير مدعوم للملفات في دليل Documents — فقط للملفات في ubiquityContainer. لا تحاول مزامنة Documents عبر iCloud؛ لهذا استخدم NSUbiquitousKeyValueStore للبيانات صغيرة الحجم أو Core Data مع CloudKit للهياكل المعقدة.

أداء FileManager

عمليات FileManager يمكن أن تكون مكلفة، خاصة على الأجهزة ذات الذاكرة الفلاشية البطيئة. تشمل توصيات Apple الرئيسية تنفيذ جميع عمليات الملفات على قوائم انتظار خلفية، وتقليل عدد استدعاءات fileExistsAtPath، وتخزين النتائج مؤقتًا.

طريقة fileExists تنفذ استدعاء نظام stat()، وهو بطيء نسبيًا. إذا كنت تتحقق من وجود ملف قبل قراءته، فمن الأفضل محاولة قراءته ومعالجة الخطأ — هذا ينفذ نفس stat لكنه يتجنب استدعاء نظام مزدوج. للفحوصات الجماعية، استخدم enumeratorAt مع resourceValues.

لـ تحسين العمل مع كميات كبيرة من البيانات:

  • استخدم FileHandle للمعالجة المتدفقة للملفات الكبيرة
  • خزّن نتائج fileManager.urls مؤقتًا للدلائل المستخدمة بشكل متكرر
  • نفذ العمليات المجمعة في قائمة انتظار دقيقة، متجنبًا حظر الخيط الرئيسي
  • استخدم CoordinatedFileManager للوصول الآمن من خيوط متعددة

توفر Apple Instruments قالب File Activity لتحليل عمليات الملفات. استخدمه لتحديد الاختناقات — على سبيل المثال، استدعاءات fileExists المتكررة في حلقة أو عمليات الكتابة في الخيط الرئيسي. أكثر مشكلات الأداء شيوعًا تتعلق بالكتابة المتزامنة للملفات الكبيرة عند تعليق التطبيق.

الأسئلة الشائعة

ما هو 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 مع كتابة مجزأة بحجم 1-2 MB.

الملخص

  • FileManager هو الكلاس المركزي في Foundation لجميع عمليات نظام الملفات في iOS: من التحقق من الوجود إلى التجوال التكراري للدلائل.
  • Documents, Library, tmp — الدلائل الثلاثة الرئيسية للتطبيق مع قواعد نسخ احتياطي ودورات حياة مختلفة.
  • API القائم على URL أفضل من المسارات القائمة على String للتوافق مع Sandbox وSecurity-Scoped Bookmarks.
  • FileHandle والمعالجة المتدفقة هي الطريقة الوحيدة للعمل مع الملفات الكبيرة دون تجاوز الذاكرة.
  • FileManagerDelegate يسمح بالتحكم في عمليات النقل والنسخ والحذف من خلال طرق should-.
  • تكامل iCloud متاح عبر ubiquityContainer وNSMetadataQuery للعمل مع الملفات السحابية.
  • أداء عمليات الملفات أمر بالغ الأهمية — نفذها في قوائم انتظار خلفية وقلل استدعاءات fileExists.

سنقوم بتطوير تطبيق جوال جاهز

تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.

مناقشة المشروع

اقرأ أيضًا