العمل مع أرشيفات ZIP في Kotlin: دليل شامل
في التطوير الحديث باستخدام Kotlin (JVM)، غالبًا ما تنشأ الحاجة إلى ضغط أو فك ضغط الملفات. توفر مكتبة Java القياسية أدوات قوية للعمل مع تنسيق ZIP من خلال حزمة java.util.zip. في هذه المقالة، سنشرح بالتفصيل كيفية إنشاء وقراءة وتعديل أرشيفات ZIP باستخدام Kotlin والإمكانيات المدمجة في JVM.
الفئات الأساسية للعمل مع ZIP
للعمل مع أرشيفات ZIP في Kotlin، تُستخدم الفئات التالية من java.util.zip:
- ZipOutputStream — لإنشاء أرشيفات ZIP جديدة وإضافة الملفات إليها.
- ZipInputStream — لقراءة محتويات الأرشيف بشكل تسلسلي (وضع التدفق).
- ZipFile — للوصول العشوائي إلى إدخالات الأرشيف (وصول عشوائي).
- ZipEntry — يمثل إدخالاً فرديًا (ملف أو دليل) داخل الأرشيف.
جميع هذه الفئات مضمنة في مكتبة JDK القياسية، لذلك لا حاجة لأي تبعيات إضافية.
إنشاء أرشيف ZIP
لإنشاء أرشيف، يُستخدم ZipOutputStream الذي يغلف FileOutputStream. يتم إضافة كل ملف عبر ZipEntry.
import java.io.Fileimport java.io.FileInputStreamimport java.io.FileOutputStreamimport java.util.zip.ZipEntryimport java.util.zip.ZipOutputStream
fun createZipArchive(sourceDir: String, zipFilePath: String) { val dir = File(sourceDir) val files = dir.listFiles() ?: return ZipOutputStream(FileOutputStream(zipFilePath)).use { zos -> for (file in files) { if (file.isFile) { // إنشاء إدخال باسم الملف val entry = ZipEntry(file.name) zos.putNextEntry(entry) // نسخ محتوى الملف FileInputStream(file).use { fis -> fis.copyTo(zos) } zos.closeEntry() } } } println("تم إنشاء الأرشيف: $zipFilePath")}
// مثال على الاستدعاءfun main() { createZipArchive("/path/to/source", "/path/to/archive.zip")}فك ضغط أرشيف ZIP
يتم فك الضغط عبر ZipInputStream. نقرأ كل إدخال ونستعيد الملفات على القرص.
import java.io.Fileimport java.io.FileInputStreamimport java.io.FileOutputStreamimport java.util.zip.ZipInputStream
fun extractZipArchive(zipFilePath: String, outputDir: String) { val outputFolder = File(outputDir).also { it.mkdirs() } ZipInputStream(FileInputStream(zipFilePath)).use { zis -> var entry = zis.nextEntry while (entry != null) { val fileName = entry.name val outputFile = File(outputFolder, fileName) // إنشاء الدلائل الأصلية إذا لزم الأمر outputFile.parentFile?.mkdirs() // فك ضغط الملفات فقط (وليس الدلائل) if (!entry.isDirectory) { FileOutputStream(outputFile).use { fos -> zis.copyTo(fos) } } entry = zis.nextEntry } } println("تم فك ضغط الأرشيف في: $outputDir")}
// مثال على الاستدعاءfun main() { extractZipArchive("/path/to/archive.zip", "/path/to/extract")}قراءة محتويات الأرشيف دون فك الضغط
لعرض الملفات داخل ZIP دون استخراجها، استخدم ZipFile والتكرار عبر entries().
import java.io.Fileimport java.util.zip.ZipFile
fun listZipContents(zipFilePath: String) { ZipFile(File(zipFilePath)).use { zipFile -> println("محتويات الأرشيف: ${zipFile.name}") println("إجمالي الإدخالات: ${