FileManager هو كلاس من إطار Foundation يوفر واجهة للعمل مع نظام الملفات في iOS وmacOS ومنصات Apple الأخرى. يتيح لك إنشاء وقراءة ونقل وحذف الملفات والدلائل، بالإضافة إلى إدارة البيانات الوصفية وأذونات الوصول. في iOS، جميع عمليات FileManager مقيدة بـ Sandbox التطبيق. وفقًا لـ توثيق Apple للمطورين (2026)، FileManager آمن للخيوط ويمكن استخدامه من خيوط الخلفية، ولكن جميع عمليات نظام الملفات يجب أن تتم مع مراعاة وضع الحماية وأذونات الوصول لـ Security-Scoped Bookmarks.
الخلاصة
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 للإبلاغ عن التقدم.
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 لديه ثلاثة دلائل رئيسية يمكن الوصول إليها عبر 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 للقراءة والكتابة المتدفقة للملفات الكبيرة، والتي لا تحمل الملف بأكمله في الذاكرة.
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 ويوفر سمات كل عنصر دون استعلام إضافي لنظام الملفات.
// التجوال التكراري للدلائل
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 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 يمكن أن تكون مكلفة، خاصة على الأجهزة ذات الذاكرة الفلاشية البطيئة. تشمل توصيات Apple الرئيسية تنفيذ جميع عمليات الملفات على قوائم انتظار خلفية، وتقليل عدد استدعاءات fileExistsAtPath، وتخزين النتائج مؤقتًا.
طريقة fileExists تنفذ استدعاء نظام stat()، وهو بطيء نسبيًا. إذا كنت تتحقق من وجود ملف قبل قراءته، فمن الأفضل محاولة قراءته ومعالجة الخطأ — هذا ينفذ نفس stat لكنه يتجنب استدعاء نظام مزدوج. للفحوصات الجماعية، استخدم enumeratorAt مع resourceValues.
لـ تحسين العمل مع كميات كبيرة من البيانات:
توفر Apple Instruments قالب File Activity لتحليل عمليات الملفات. استخدمه لتحديد الاختناقات — على سبيل المثال، استدعاءات fileExists المتكررة في حلقة أو عمليات الكتابة في الخيط الرئيسي. أكثر مشكلات الأداء شيوعًا تتعلق بالكتابة المتزامنة للملفات الكبيرة عند تعليق التطبيق.
الأسئلة الشائعة
FileManager هو كلاس من إطار Foundation للعمل مع نظام ملفات Apple. يوفر API لإنشاء وقراءة ونقل وحذف الملفات والدلائل. في iOS، عمله محدود بـ Sandbox التطبيق، باستثناء Security-Scoped Bookmarks.
Documents — بيانات المستخدم مع نسخ احتياطي في iCloud. Library/Caches — تخزين مؤقت بدون نسخ احتياطي. Library/Application Support — قواعد البيانات. tmp — ملفات مؤقتة. App Group Container — للبيانات المشتركة بين تطبيقات نفس المجموعة.
استدع FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first. الطريقة تُرجع URL بالمسار المطلق لدليل Documents داخل Sandbox التطبيق الحالي. استخدم fileExists(atPath:) للتحقق من الوجود.
لا، Sandbox في iOS يمنع الوصول إلى نظام ملفات التطبيقات الأخرى. استثناءات: App Groups (دليل مشترك لتطبيقات نفس المطور) وSecurity-Scoped Bookmarks (الوصول إلى الملفات عبر UIDocumentPicker وiCloud Drive).
استخدم خيار .atomic عند الكتابة — يتم حفظ البيانات أولاً في ملف مؤقت، ثم نقلها بشكل ذري إلى المسار الهدف. هذا يمنع تلف الملف إذا فشلت الكتابة. للبيانات الكبيرة، استخدم FileHandle مع كتابة مجزأة بحجم 1-2 MB.
الملخص
سنقوم بتطوير تطبيق جوال جاهز
تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.
اقرأ أيضًا