العمل مع أرشيفات ZIP في Swift (iOS/macOS): دليل شامل

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

العمل مع أرشيفات ZIP في Swift (iOS/macOS)

في تطوير iOS وmacOS الحديث، غالباً ما تنشأ الحاجة لضغط وفك ضغط الملفات. أرشيفات ZIP هي الطريقة القياسية لضغط البيانات، المدعومة على جميع منصات Apple. في هذه المقالة، سنستعرض الأدوات الأصلية في Swift للعمل مع ZIP، بالإضافة إلى المكتبة الشهيرة ZIPFoundation.



الأدوات الأصلية في Foundation

يوفر إطار العمل Foundation إمكانيات أساسية للعمل مع الأرشيفات عبر الفئة NSFileCoordinator والأدوات النظامية. ومع ذلك، للعمل الكامل مع ZIP، يُوصى باستخدام مكتبات خارجية أو أغلفة للأوامر النظامية.



مكتبة ZIPFoundation

ZIPFoundation هي مكتبة خفيفة الوزن للعمل مع أرشيفات ZIP، مكتوبة بلغة Swift النقية. تدعم iOS وmacOS وtvOS وwatchOS، ولا تتطلب تبعيات خارجية، وهي مرخصة بموجب رخصة MIT.



التثبيت عبر Swift Package Manager

أضف التبعية في Package.swift:

dependencies: [    .package(url: "https://github.com/weichsel/ZIPFoundation.git", from: "0.9.16")]

أو عبر Xcode: File → Add Packages → أدخل رابط المستودع.



العمليات الأساسية



1. إنشاء أرشيف ZIP

ضغط ملف واحد:

import ZIPFoundation

let fileManager = FileManager.defaultlet sourceURL = URL(fileURLWithPath: "/path/to/file.txt")let destinationURL = URL(fileURLWithPath: "/path/to/archive.zip")

do { try fileManager.zipItem(at: sourceURL, to: destinationURL) print("تم إنشاء الأرشيف: \\(destinationURL.path)")} catch { print("خطأ: \\(error.localizedDescription)")}


ضغط مجلد كامل:

let directoryURL = URL(fileURLWithPath: "/path/to/folder")let archiveURL = URL(fileURLWithPath: "/path/to/folder.zip")

do { try fileManager.zipItem(at: directoryURL, to: archiveURL) print("تم ضغط المجلد")} catch { print("خطأ: \\(error)")}


2. فك ضغط الأرشيف

let archiveURL = URL(fileURLWithPath: "/path/to/archive.zip")let destinationURL = URL(fileURLWithPath: "/path/to/unzip")

do { try fileManager.unzipItem(at: archiveURL, to: destinationURL) print("تم فك الضغط بنجاح")} catch { print("خطأ في فك الضغط: \\(error)")}


3. العمل مع محتويات الأرشيف دون استخراج

guard let archive = Archive(url: archiveURL, accessMode: .read) else {    fatalError("تعذر فتح الأرشيف")}

// قائمة جميع الإدخالاتfor entry in archive { print("ملف: \\(entry.path), الحجم: \\(entry.uncompressedSize) بايت")}

// قراءة ملف معينif let entry = archive["documents/report.pdf"] { var data = Data() do { _ = try archive.extract(entry, bufferSize: 4096) { partialData in data.append(partialData) } print("تم استخراج \\(data.count) بايت") } catch { print("خطأ: \\(error)") }}


4. إضافة ملفات إلى أرشيف موجود

guard let archive = Archive(url: archiveURL, accessMode: .update) else {    fatalError("تعذر فتح الأرشيف للتحديث")}

let newFileURL = URL(fileURLWithPath: "/path/to/new_file.txt")do { try archive.addEntry(with: "new_file.txt", relativeTo: newFileURL.deletingLastPathComponent()) print("تمت إضافة الملف")} catch { print("خطأ: \\(error)")}


العمل مع التقدم والملفات الكبيرة

للملفات الكبيرة، استخدم Progress:

let progress = Progress(totalUnitCount: 100)let archiveURL = URL(fileURLWithPath: "/path/to/large.zip")let destinationURL = URL(fileURLWithPath: "/path/to/output")

do { try FileManager.default.unzipItem(at: archiveURL, to: destinationURL, progress

توصيات