مقدمة: لماذا تحتاج إلى العمل مع الملفات في JavaScript؟
\n\nعندما نتحدث عن JavaScript، يتذكر معظم الناس المتصفح والواجهات التفاعلية. ولكن مع ظهور منصة Node.js، تجاوز JavaScript حدود صفحات الويب بكثير. اليوم هي لغة كاملة لتطوير الخوادم والأتمتة والأدوات المساعدة. ومن المهام الرئيسية التي يواجهها كل مطور هي العمل مع نظام الملفات.
\n\nالقدرة على قراءة وكتابة ونقل وحذف الملفات هي الأساس الذي لا يمكن تصور أي مشروع جاد بدونه. سواء كان مسجلًا أو ملف تكوين أو تحميل صور أو تحليل بيانات - كل شيء يحتاج إلى الوصول إلى نظام الملفات.
\n\nفي هذه المقالة، سنستعرض أمثلة عملية للعمل مع نظام الملفات في Node.js. ستتعلم كيفية استخدام الوحدة المدمجة fs، وما هي الطرق المتاحة وكيفية تجنب الأخطاء الشائعة. يمكن تشغيل واختبار كل الكود فورًا.
الطرق الأساسية لوحدة fs
\n\nوحدة fs (نظام الملفات) مضمنة في التثبيت القياسي لـ Node.js. لا تحتاج إلى تثبيتها بشكل منفصل. لبدء العمل، يكفي تضمينها في بداية الملف:
const fs = require('fs');\nconst fsPromises = require('fs').promises; // للعمل مع الوعود\n\nجميع طرق وحدة fs موجودة في ثلاثة إصدارات:
- \n
- متزامنة - تمنع تنفيذ الكود حتى اكتمال العملية. عادةً ما تحتوي على اللاحقة
Sync. \n - غير متزامنة مع دوال الاسترجاع - النمط الكلاسيكي لـ Node.js. \n
- غير متزامنة مع الوعود - النهج الحديث عبر
fs.promises. \n
في المشاريع الحديثة، يُوصى باستخدام الوعود و async/await. هذا يجعل الكود أنظف وأكثر وضوحًا.
قراءة الملفات
\n\nالسيناريو الأكثر شيوعًا هو قراءة محتوى ملف. لنلقِ نظرة على مثال مع ملف نصي data.txt:
const fs = require('fs').promises;\n\nasync function readFileExample() {\n try {\n const data = await fs.readFile('data.txt', 'utf8');\n console.log('محتوى الملف:');\n console.log(data);\n } catch (err) {\n console.error('خطأ في قراءة الملف:', err.message);\n }\n}\n\nreadFileExample();\n\nالمعامل الثاني 'utf8' يحدد الترميز. إذا حذفته، ستحصل على مخزن مؤقت خام (Buffer). بالنسبة للملفات النصية، حدد الترميز دائمًا.
الكتابة في ملف
\n\nيمكن كتابة البيانات في ملف بطريقتين: استبدال كامل أو إضافة في النهاية.
\n\nاستبدال الملف:
\nconst fs = require('fs').promises;\n\nasync function writeFileExample() {\n try {\n await fs.writeFile('output.txt', 'مرحبًا، نظام الملفات!');\n console.log('تم كتابة الملف بنجاح');\n } catch (err) {\n console.error('خطأ في الكتابة:', err.message);\n }\n}\n\nwriteFileExample();\n\nالإضافة في نهاية الملف:
\nconst fs = require('fs').promises;\n\nasync function appendFileExample() {\n try {\n await fs.appendFile('log.txt', `إدخال جديد: ${new Date().toISOString()}\\n`);\n console.log('تمت إضافة البيانات');\n } catch (err) {\n console.error('خطأ في الإضافة:', err.message);\n }\n}\n\nappendFileExample();\n\nطريقة appendFile مثالية لتسجيل السجلات أو تجميع البيانات.
إدارة الدلائل والملفات
\n\nالعمل مع نظام الملفات لا يقتصر على القراءة والكتابة. غالبًا ما تحتاج إلى إنشاء مجلدات، أو التحقق من وجود ملفات، أو حذفها.
\n\nإنشاء وحذف الدلائل
\n\nconst fs = require('fs').promises;\n\nasync function manageDirectories() {\n try {\n // إنشاء دليل (إذا لم يكن موجودًا)\n await fs.mk