العمل مع أرشيفات ZIP في Kotlin: الإنشاء والقراءة وفك الضغط

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

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

ابدأ الدورة

العمل مع أرشيفات ZIP في Kotlin



في التطوير الحديث باستخدام Kotlin (سواءً لـ JVM أو Android)، غالبًا ما تنشأ الحاجة إلى ضغط الملفات في أرشيفات ZIP أو استخراج البيانات منها. توفر المكتبة القياسية لجافا (java.util.zip) جميع الفئات اللازمة التي تعمل بشكل ممتاز مع Kotlin أيضًا. في هذه المقالة، سنشرح بالتفصيل ثلاث عمليات رئيسية: إنشاء الأرشيف، قراءة المحتوى، وفك ضغط الملفات.



1. إنشاء أرشيف ZIP (ضغط الملفات)



لإنشاء أرشيف، نستخدم ZipOutputStream. يتم إضافة كل ملف كإدخال منفصل (ZipEntry). لنلقِ نظرة على مثال يقوم بضغط عدة ملفات في أرشيف واحد.



import java.io.Fileimport java.io.FileInputStreamimport java.io.FileOutputStreamimport java.util.zip.ZipEntryimport java.util.zip.ZipOutputStream

fun createZip( filesToZip: List<File>, outputZipFile: File) { ZipOutputStream(FileOutputStream(outputZipFile)).use { zipOut -> for (file in filesToZip) { // إنشاء إدخال باسم الملف val entry = ZipEntry(file.name) zipOut.putNextEntry(entry)

// قراءة الملف الأصلي وكتابته في الأرشيف FileInputStream(file).use { fis -> fis.copyTo(zipOut) } zipOut.closeEntry() } }}

fun main() { val files = listOf( File("document.txt"), File("image.png"), File("data.json") ) val archive = File("my_archive.zip") createZip(files, archive) println("تم إنشاء الأرشيف: ${archive.absolutePath}")}


لاحظ استخدام .use { ... } — وهو إغلاق آمن للموارد، يعادل try-with-resources في جافا. إذا كنت بحاجة إلى ضغط ملفات من مجلدات فرعية، ستحتاج إلى اجتياز الدلائل بشكل متكرر وحفظ المسارات النسبية في اسم ZipEntry.



2. قراءة محتوى الأرشيف (عرض قائمة الملفات)



في بعض الأحيان، نحتاج فقط إلى رؤية الملفات الموجودة داخل الأرشيف دون استخراجها. لهذا، نستخدم ZipFile أو ZipInputStream. الخيار الأول أكثر ملاءمة إذا كان الأرشيف موجودًا بالفعل وليس كبيرًا جدًا.



import java.io.Fileimport java.util.zip.ZipFile

fun listZipContent(zipFile: File) { ZipFile(zipFile).use { zip -> val entries = zip.entries() while (entries.hasMoreElements()) { val entry = entries.nextElement() println("${entry.name} (${entry.size} بايت)") } }}

fun main() { val archive = File("my_archive.zip") if (archive.exists()) { listZipContent(archive) } else { println("الملف غير موجود") }}


تقوم طريقة entries() بإرجاع تعداد لجميع الإدخالات. لكل إدخال، يمكن الوصول إلى الاسم والحجم وتاريخ التعديل والعلامات (على سبيل المثال، ما إذا كان الإدخال دليلاً).



3. فك ضغط أرشيف ZIP (استخراج الملفات)



لاستخراج الملفات، من المناسب استخدام ZipInputStream. فهو يقرأ الأرشيف بشكل تسلسلي، إدخالاً تلو الآخر. فيما يلي مثال على فك الضغط الكامل إلى مجلد محدد.



import java.io.Fileimport java.io.FileInputStreamimport java.io.FileOutputStreamimport java.util.zip.ZipInputStream

fun extractZip( zipFile: File, outputDir: File) { if (!outputDir.exists()) { outputDir.mkdirs() }

ZipInputStream(FileInputStream(zipFile)).use { zis -> var entry = zis.nextEntry while (entry != null) { val targetFile = File(outputDir, entry.name)

// إنشاء الدلائل الأصلية إذا لزم الأمر targetFile.parentFile?.mkdirs()

// إذا كان الإدخال دليلاً، قم بإنشائه فقط if (entry.isDirectory) { targetFile.mkdirs() } else {

توصيات