في العقدة، تشير وحدة fs إلى "وحدة نظام الملفات"، وهي وحدة تستخدم لتشغيل الملفات. توفر معظم واجهات برمجة التطبيقات الخاصة بوحدة fs ثلاث طرق تشغيل: 1. تشغيل الملف المتزامن: سيتم حظر الكود ولن يستمر في التنفيذ؛ 2. ملف تشغيل وظيفة رد الاتصال غير المتزامن: لن يتم حظر الكود ويجب أن تكون هناك وظيفة رد اتصال تم تمريره. عند إنشاء النتيجة، يتم تنفيذ وظيفة رد الاتصال؛ 3. ملف عملية الوعد غير المتزامن: لن يتم حظر الكود، وسيتم إرجاع الوعد عن طريق استدعاء عملية الطريقة من خلال fs.promises.
بيئة تشغيل هذا البرنامج التعليمي: نظام Windows 7، إصدار Nodejs 16، كمبيوتر DELL G3.
تسمح لنا وحدة نظام الملفات (fs للاختصار) بالوصول إلى نظام الملفات على جهاز الكمبيوتر الخاص بنا والتفاعل معه.
الوحدة fs هي وحدة مقدمة رسميًا من Node.js لتشغيل الملفات. فهو يوفر سلسلة من الأساليب والخصائص لتلبية احتياجات تشغيل الملفات للمستخدمين.
طريقة fs.readFile () تستخدم لقراءة محتويات الملف المحدد
طريقة fs.writeFile()، تُستخدم لكتابة المحتوى إلى الملف المحدد إذا كنت تريد استخدامه في كود JavaScript
وحدة نظام الملفات هي وحدة Node.js الأساسية. هذا يعني أنه ليس علينا تثبيته. الشيء الوحيد الذي يتعين علينا القيام به هو استيراد وحدة fs إلى ملفها الخاص.
لذلك في الجزء العلوي من الملف أضف:
const خ = يتطلب ('fs')يمكننا الآن استدعاء أي طريقة من وحدة نظام الملفات باستخدام البادئة fs.
وبدلاً من ذلك، يمكننا فقط استيراد الأساليب المطلوبة من واجهة برمجة تطبيقات fs على النحو التالي:
const { writeFile, readFile } = require('fs')ملاحظة: للسهولة، نحتاج أيضًا إلى استيراد وحدة المسار. إنها وحدة Node.js أساسية أخرى تسمح لنا بالعمل مع مسارات الملفات والدليل.
بعد استيراد وحدة fs، قم بإضافة:
مسار ثابت = يتطلب ("المسار")عند استخدام وحدة نظام الملفات، فإن وحدة المسار غير مطلوبة. لكنه يساعدنا كثيرا!
تدعم عمليات الملفات الخاصة بوحدة fs بوجه عام واجهتي برمجة التطبيقات: المتزامنة وغير المتزامنة، وتتضمن أيضًا وظائف رد الاتصال ونماذج العروض الترويجية. عادةً ما يتبع التزامن كلمة sync.
توفر معظم واجهات برمجة التطبيقات (APIs) الخاصة بوحدة fs ثلاث طرق تشغيل:
التشغيل المتزامن للملفات: سيتم حظر الكود ولن يستمر في التنفيذ
ملف تشغيل وظيفة رد الاتصال غير المتزامن: لن يتم حظر الكود، ويجب تمرير وظيفة رد الاتصال، وعندما يتم الحصول على النتيجة، يتم تنفيذ وظيفة رد الاتصال
ملفات عملية الوعد غير المتزامنة: لن يتم حظر الكود من خلال عمليات طريقة الاتصال من خلال fs.promises، والتي يمكن معالجتها والتقاطها.
لاحظ أن كافة أساليب fs غير متزامنة بشكل افتراضي. ومع ذلك، يمكننا استخدام النسخة المتزامنة عن طريق إضافة Sync في نهاية الطريقة.
على سبيل المثال، الإصدار المتزامن من أسلوب writeFile هو writeFileSync. تُكمل الطرق المتزامنة التعليمات البرمجية بشكل متزامن، لذا فهي تحظر الخيط الرئيسي. يعتبر حظر الخيط الرئيسي في Node.js ممارسة سيئة ولا ينبغي لنا القيام بذلك.
لذلك، أدناه سوف نستخدم الطرق غير المتزامنة في وحدة نظام الملفات.
للكتابة إلى ملف من تطبيق Node.js، استخدم التابع writeFile.
يقبل الأسلوب writeFile المعلمات التالية على الأقل:
رد اتصال محتوى اسم الملفإذا كان الملف المحدد موجودًا بالفعل، فإنه يستبدل المحتوى القديم بالمحتوى الذي توفره كوسيطة. في حالة عدم وجود الملف المحدد، يتم إنشاء ملف جديد.
بعد استيراد وحدات fs والمسار، اكتب الكود التالي في الملف:
fs.writeFile('content.txt', 'كل العمل وعدم اللعب يجعل جاك فتى ممل!', err => { if (err) throw errprocess.stdout.write('تم الإنشاء بنجاح!')})سيقوم الكود أعلاه بإنشاء ملف جديد باسم content.txt وإضافة النص "كل العمل وعدم اللعب" يجعل جاك فتى مملًا كمحتوى! إذا كانت هناك أية أخطاء، فستقوم وظيفة رد الاتصال بإلقاء هذا الخطأ. وإلا، فسيتم إخراج الملف إلى وحدة التحكم بنجاح.
هناك أشكال أخرى من writeFile، مثل:
fs.writeFileSync - كتابة الملفات بشكل متزامن fsPromises.writeFile - كتابة الملفات باستخدام واجهة برمجة التطبيقات المستندة إلى Promiseتحقق من هذا الجوهر: https://Gist.github.com/catalinpit/571ba06c06214b5c8744036c6500af92
قبل قراءة ملف، يجب إنشاء المسار إلى الملف وتخزينه. مسار وحدة المسار مناسب هنا.
باستخدام طريقة المسار من وحدة الانضمام، يمكنك إنشاء مسار ملف كما يلي:
const filePath = path.join(process.cwd(), 'content.txt')تقوم المعلمة الأولىprocess.cwd() بإرجاع دليل العمل الحالي. الآن بعد أن حصلت على مسار الملف، يمكنك قراءة محتويات الملف.
اكتب الكود التالي في الملف:
fs.readFile(filePath, (error, content) => { if (error) throw errorprocess.stdout.write(content)})يقبل الأسلوب readFile معلمتين على الأقل:
رد اتصال مسار الملفإذا كان هناك خطأ، فإنه سوف يلقي خطأ. وبخلاف ذلك، فإنه يطبع محتويات الملف في المحطة.
هناك أشكال أخرى من readFile، مثل:
fs.readFileSync - الكتابة إلى ملف بشكل متزامن fsPromises.readFile - الكتابة إلى ملف باستخدام واجهة برمجة التطبيقات المستندة إلى Promiseتحقق من هذا الجوهر: https://Gist.github.com/catalinpit/badc2a539a44412892a0e05a9575d54d
إن عرض ملف في دليل يشبه إلى حد كبير قراءة محتويات الملف. ومع ذلك، بدلاً من تمرير مسار الملف، قم بتمرير دليل العمل الحالي (يمكننا تمرير أي دليل آخر).
ثم قم بتمرير وظيفة رد الاتصال للتعامل مع الاستجابة. اكتب الكود التالي في الملف:
fs.readdir(process.cwd(), (error, files) => { إذا (خطأ) ألقى خطأ console.log(files)})حتى الآن، استخدمنا العملية فقط.stdout.write لإخراج المحتوى إلى الوحدة الطرفية. ومع ذلك، يمكنك ببساطة استخدام console.log، كما هو الحال في مقتطف الشفرة أعلاه.
إذا قمنا بتشغيل التطبيق، فيجب أن نحصل على مصفوفة تحتوي على جميع الملفات الموجودة في الدليل.
تحقق من هذا الجوهر: https://Gist.github.com/catalinpit/f82c4e6ae3acd5d97efdecb0bc67979e
تحتوي وحدة نظام الملفات على طريقة تسمح لك بحذف الملفات. ومع ذلك، من المهم ملاحظة أنه يعمل فقط مع الملفات، وليس مع الأدلة.
عندما يتم استدعاء أسلوب إلغاء الارتباط باستخدام مسار ملف كمعلمة، فإنه يحذف الملف. أضف مقتطف التعليمات البرمجية التالي إلى الملف:
fs.unlink(filePath, error => { إذا (خطأ) ألقى خطأ console.log('تم حذف الملف!')})إذا قمت بإعادة تشغيل التعليمات البرمجية، سيتم حذف الملفات الخاصة بك!
تحقق من هذا الجوهر: https://Gist.github.com/catalinpit/b1201434218c400f77e042109bfce99e
يمكننا إنشاء دليل بشكل غير متزامن باستخدام طريقة mkdir. اكتب الكود التالي في الملف:
fs.mkdir(`${process.cwd()}/myFolder/ SecondFolder`, { recursive: true }, (err) => { if (err) throw err console.log('تم إنشاء المجلد بنجاح!') })أولاً، قم بإنشاء مجلد جديد في دليل العمل الحالي. كما ذكرنا من قبل، يمكنك الحصول على دليل العمل الحالي من كائن العملية باستخدام طريقة cwd().
ثم قم بتمرير المجلد أو المجلدات المراد إنشاؤها. ومع ذلك، هذا لا يعني أنه يتعين عليك إنشاء مجلد جديد في دليل العمل الحالي لديك. يمكنك إنشائها في أي مكان.
الآن، المعلمة الثانية هي الخيار العودي. إذا لم يتم تعيينه على "صحيح"، فلا يمكن إنشاء مجلدات متعددة. إذا تم تعيين الخيار العودي على خطأ، فسيعطي الكود أعلاه خطأً. جربها!
ومع ذلك، إذا كنت تريد إنشاء مجلد فقط، فليست هناك حاجة لتعيين الخيار العودي على صحيح.
الكود التالي يعمل بشكل جيد!
fs.mkdir(`${process.cwd()}/myFolder`, err => { if (err) throw err console.log('تم إنشاء المجلد بنجاح!')});ولذلك، أود أن أؤكد على استخدام العودية. تحتاج إلى ضبط هذا على "صحيح" إذا كنت تريد إنشاء مجلدات داخل المجلدات. سيقوم بإنشاء كافة المجلدات حتى لو لم تكن موجودة.
من ناحية أخرى، إذا كنت تريد إنشاء مجلد فقط، فيمكنك تركه خطأ.
تحقق من هذا الجوهر: https://Gist.github.com/catalinpit/09bad802541102c0cce2a2e4c3985066
يشبه منطق حذف الدليل إنشاء دليل. إذا نظرت إلى الكود المكتوب لإنشاء الدليل والكود الموجود أدناه، فسترى أوجه التشابه.
لذا اكتب الكود التالي في الملف:
fs.rmdir(`${process.cwd()}/myFolder/`, { recursive: true }, err => { if (err) throw err console.log('تم حذف المجلد بنجاح!')})استخدم الطريقة rmdir من وحدة نظام الملفات وقم بتمرير المعلمات التالية:
الدليل المراد حذفه رد اتصال الخاصية العوديةإذا تم تعيين الخاصية العودية على true، فسيتم حذف المجلد ومحتوياته. من المهم ملاحظة أنك تحتاج إلى تعيين هذا على "صحيح" إذا كان المجلد يحتوي على محتوى. وإلا سوف تحصل على خطأ.
يعمل مقتطف الكود التالي فقط عندما يكون المجلد فارغًا:
fs.rmdir(`${process.cwd()}/myFolder/`, err => { if (err) throw err console.log('تم حذف المجلد بنجاح!')})إذا كانت هناك ملفات و/أو مجلدات أخرى في myFolder، فسيحدث خطأ إذا لم يتم تمرير { recursive: true }.
من المهم معرفة متى تستخدم الخيار العودي ومتى لا تستخدمه لتجنب المشاكل.
تحقق من هذا الجوهر: https://Gist.github.com/catalinpit/a8cb6aca75cef8d6ac5043eae9ba22ce
باستخدام الوحدة FS، يمكنك إعادة تسمية الدلائل والملفات. يوضح مقتطف التعليمات البرمجية التالي كيفية القيام بذلك باستخدام طريقة إعادة التسمية.
// إعادة تسمية الدليل fs.rename(`${process.cwd()}/myFolder/ SecondFolder`, `${process.cwd()}/myFolder/newFolder`, err => { if (err) throw err console .log('إعادة تسمية الدليل!')});// إعادة تسمية ملف fs.rename(`${process.cwd()}/content.txt`, `${process.cwd()}/newFile .txt` , err => { if (err) throw err console.log('تمت إعادة تسمية الملف!')});تحتوي طريقة إعادة التسمية على ثلاث معلمات:
المعلمة الأولى هي المجلد/الملف الموجود والمعلمة الثانية هي رد الاتصال بالاسم الجديدلذلك، لإعادة تسمية ملف أو دليل، نحتاج إلى تمرير اسم الملف/الدليل الحالي والاسم الجديد. بعد تشغيل التطبيق، يجب تحديث أسماء الدلائل/الملفات.
لاحظ أنه إذا كان المسار الجديد موجودًا بالفعل (على سبيل المثال، اسم جديد لملف/مجلد)، فسيتم استبداله. لذا تأكد من عدم الكتابة فوق الملفات/المجلدات الموجودة عن طريق الخطأ.
تحقق من هذا الجوهر: https://Gist.github.com/catalinpit/5c3e7c6ae39d09996ff67175a719122e
يمكننا أيضًا إضافة محتوى جديد إلى ملف موجود باستخدام التابع appendFile.
إذا قارنا الطريقتين writeFile وappendFile، فسنرى أنهما متشابهتان. قم بتمرير مسار الملف والمحتوى ورد الاتصال.
fs.appendFile(filePath, 'nكل العمل وعدم اللعب يجعل جاك فتى ممل!', err => { if (err) throw err console.log('كل العمل وعدم اللعب يجعل جاك فتى ممل!')} )يوضح مقتطف الشفرة أعلاه كيفية إضافة محتوى جديد إلى ملف موجود. إذا قمت بتشغيل التطبيق وفتحت الملف، فيجب أن ترى المحتوى الجديد بداخله.