مقدمة: لماذا العمل مع نظام الملفات في Swift مهم
أي تطبيق على iOS أو macOS سيواجه عاجلاً أم آجلاً الحاجة إلى حفظ البيانات على جهاز المستخدم. سواء كان ذلك تخزين الصور مؤقتاً، أو تحميل المستندات، أو حفظ الإعدادات - فإن العمل مع نظام الملفات في Swift هو مهارة أساسية لكل مطور. في هذه المقالة، سنستعرض عملياً كيفية استخدام FileManager، والعمل مع الدلائل، وقراءة وكتابة الملفات، بالإضافة إلى إدارة سماتها. ستحصل على أمثلة جاهزة للكود يمكن تطبيقها فوراً في مشروعك.
الأدوات الأساسية: FileManager و URL
الفئة المركزية للعمل مع نظام الملفات في Swift هي FileManager. توفر واجهة موحدة للتفاعل مع نظام الملفات على كل من iOS و macOS. المكون الرئيسي الثاني هو URL، والذي يُستخدم لتحديد المسارات إلى الملفات والدلائل.
الحصول على الدلائل القياسية
أول شيء يجب أن تعرفه هو كيفية الحصول على مسارات الدلائل النظامية: Documents، Library، Caches، و Temporary. إليك كيفية القيام بذلك:
import Foundation
let fileManager = FileManager.default
// دليل Documents - للبيانات الخاصة بالمستخدمguard let documentsURL = fileManager.urls(for: .documentDirectory, in: .userDomainMask).first else { fatalError("فشل في الحصول على دليل Documents")}print("Documents: \\(documentsURL.path)")
// دليل Caches - للبيانات المخزنة مؤقتاًlet cachesURL = fileManager.urls(for: .cachesDirectory, in: .userDomainMask).first!print("Caches: \\(cachesURL.path)")
// الدليل المؤقت - للملفات التي يمكن حذفها في أي وقتlet tempURL = fileManager.temporaryDirectoryprint("Temp: \\(tempURL.path)")هام: على iOS، يمكن للتطبيق كتابة البيانات فقط داخل بيئته الرملية (sandbox). الوصول إلى ملفات النظام أو ملفات التطبيقات الأخرى محظور.
إنشاء وقراءة وكتابة الملفات
الآن ننتقل إلى العمليات العملية. سننظر في كيفية إنشاء الملفات، وكتابة البيانات فيها، وقراءتها مرة أخرى.
كتابة البيانات إلى ملف
أبسط طريقة هي استخدام طريقة write(to:) للنصوص أو Data. لكن للاعتمادية، استخدم دائماً معالجة الأخطاء:
let documentsURL = fileManager.urls(for: .documentDirectory, in: .userDomainMask).first!let fileURL = documentsURL.appendingPathComponent("example.txt")
let content = "مرحباً، Swift! هذا ملف اختباري."
do { try content.write(to: fileURL, atomically: true, encoding: .utf8) print("تم إنشاء الملف بنجاح: \\(fileURL.lastPathComponent)")} catch { print("خطأ في الكتابة: \\(error.localizedDescription)")}قراءة البيانات من ملف
تتم القراءة بالمثل - باستخدام المُنشئ String(contentsOf:) أو طرق Data:
do { let savedContent = try String(contentsOf: fileURL, encoding: .utf8) print("محتوى الملف: \\(savedContent)")} catch { print("خطأ في القراءة: \\(error.localizedDescription)")}العمل مع البيانات الثنائية (الصور، الأرشيفات)
للملفات الثنائية، استخدم النوع Data:
// كتابة بيانات ثنائيةlet imageData = UIImage(named: "example.png")?.pngData()let imageURL = documentsURL.appendingPathComponent("image.png")
do { try imageData?.write(to: imageURL)} catch { print("خطأ في كتابة الصورة: \\(error)")}
// قراءة بيانات ثنائيةif let loadedData = try? Data(contentsOf: imageURL) { let loadedImage = UIImage(data: loadedData) print("تم تحميل الصورة: \\(loadedImage != nil)")}إدارة الدلائل والملفات
الكتابة والقراءة وحدها لا تكفي. غالباً ما يكون من الضروري إنشاء أدلة فرعية، ونقل، ونسخ، أو حذف