مقدمة
العمل مع نظام الملفات هو أحد المهام الأساسية في أي لغة برمجة. في Kotlin، بفضل تركيبته المختصرة والإضافات القوية للمكتبة القياسية Java، يصبح تنفيذ العمليات على الملفات والمجلدات بسيطًا وبديهيًا.
في هذه المقالة، سنستعرض عمليًا العمليات الأساسية: الإنشاء والقراءة والكتابة والنسخ والنقل والحذف للملفات والمجلدات. جميع الأمثلة مكتوبة بلغة Kotlin وجاهزة للاستخدام في مشاريعك. ستكون المادة مفيدة لكل من المبتدئين والمطورين ذوي الخبرة الذين يرغبون في تحديث معرفتهم أو إيجاد حلول مثالية للمهام اليومية.
الفئات الأساسية والاستيرادات
للعمل مع نظام الملفات في Kotlin، تُستخدم فئات من حزمة java.io (مثل File) و java.nio.file (مثل Path، Files). التوصيات الحديثة تفضل استخدام java.nio.file لأن هذه الواجهة البرمجية أكثر أداءً وراحة.
لجميع الأمثلة، سنحتاج إلى الاستيرادات التالية:
import java.io.Fileimport java.nio.file.Pathimport java.nio.file.Pathsimport java.nio.file.Filesimport java.nio.file.StandardCopyOptionimport java.nio.file.StandardOpenOptionإنشاء ملف ومجلد
لنبدأ بأبسط شيء - إنشاء ملف ومجلد جديدين.
// إنشاء مجلدval dir = File("my_directory")if (!dir.exists()) { dir.mkdirs() // mkdirs() ينشئ جميع المجلدات الأصلية المفقودة println("تم إنشاء المجلد: ${dir.absolutePath}")}
// إنشاء ملفval file = File(dir, "example.txt")if (!file.exists()) { file.createNewFile() println("تم إنشاء الملف: ${file.absolutePath}")}لاحظ: mkdirs() ينشئ سلسلة المجلدات بأكملها إذا لم تكن موجودة. mkdir() ينشئ فقط المجلد الأخير وسيعيد false إذا كان المجلد الأصلي مفقودًا.
قراءة وكتابة الملفات
هذه هي العمليات الأكثر شيوعًا. تقدم Kotlin عدة طرق أنيقة للعمل مع محتوى الملفات.
الكتابة في ملف
val path = Paths.get("my_directory/write_example.txt")
// سلسلة للكتابةval content = "مرحبًا بالعالم! هذه السلسلة كُتبت في ملف.السطر الثاني."
// كتابة سلسلة بسيطة (تستبدل الملف)Files.writeString(path, content)
// كتابة قائمة من السلاسلval lines = listOf("السطر 1", "السطر 2", "السطر 3")Files.write(path, lines)
// إلحاق بنهاية الملفval additionalContent = "سطر إضافي."Files.writeString(path, additionalContent, StandardOpenOption.APPEND)ظهرت طريقة Files.writeString() في Java 11 وهي متاحة في Kotlin/JVM. إذا كنت بحاجة لدعم إصدارات أقدم، استخدم Files.write() مع تحديد الترميز.
القراءة من ملف
val path = Paths.get("my_directory/write_example.txt")
// قراءة كل المحتوى في سلسلةval fullContent = Files.readString(path)println("محتوى الملف:$fullContent")
// القراءة في قائمة من السلاسلval allLines: List<String> = Files.readAllLines(path)allLines.forEachIndexed { index, line -> println("السطر ${index + 1}: $line")}
// القراءة باستخدام Stream (للملفات الكبيرة)Files.lines(path).use { stream -> stream.forEach { line -> println("أقوم بمعالجة السطر: $line") }}التركيبة .use { ... } تضمن إغلاق التدفق بعد المعالجة، وهو أمر مهم خاصة عند العمل مع الملفات الكبيرة.
النسخ والنقل وإعادة التسمية
يتم تنفيذ هذه العمليات أيضًا عبر java.nio.file.Files.
نسخ ملف
val source = Paths.get("my_directory/example.txt")val destination = Paths.get("my_directory/backup/example_copy.txt")