استخدام وحدات النظام المدمجة (Core Modules) مثل os و path
ماذا سنتعلم اليوم؟ سنتعمق في كيفية الاستفادة من وحدتي os و path الأساسيتين في Node.js لإدارة معلومات نظام التشغيل والتعامل مع مسارات الملفات والمجلدات بكفاءة واحترافية.
الخطوة 1: استكشاف معلومات نظام التشغيل باستخدام وحدة os
سنبدأ بفهم كيفية الوصول إلى معلومات أساسية حول نظام التشغيل الذي يعمل عليه تطبيقنا، مثل نوع المنصة، بنية المعالج، وذاكرة النظام المتاحة.
const os = require('os'); // استيراد وحدة os للوصول إلى معلومات نظام التشغيل
console.log('معلومات نظام التشغيل:');
console.log(<code dir="ltr" style="background:#f3f4f6; color:#0056b3; padding:2px 6px; border-radius:4px; font-family:monospace; direction:ltr !important; display:inline-block;">نوع المنصة: ${os.platform()}</code>); // يعرض نوع نظام التشغيل (مثل 'win32', 'linux', 'darwin')
console.log(<code dir="ltr" style="background:#f3f4f6; color:#0056b3; padding:2px 6px; border-radius:4px; font-family:monospace; direction:ltr !important; display:inline-block;">بنية المعالج: ${os.arch()}</code>); // يعرض بنية المعالج (مثل 'x64', 'arm64')
console.log(<code dir="ltr" style="background:#f3f4f6; color:#0056b3; padding:2px 6px; border-radius:4px; font-family:monospace; direction:ltr !important; display:inline-block;">إجمالي الذاكرة (بايت): ${os.totalmem()}</code>); // يعرض إجمالي الذاكرة العشوائية للنظام بالبايت
console.log(<code dir="ltr" style="background:#f3f4f6; color:#0056b3; padding:2px 6px; border-radius:4px; font-family:monospace; direction:ltr !important; display:inline-block;">الذاكرة الحرة (بايت): ${os.freemem()}</code>); // يعرض الذاكرة العشوائية المتاحة حالياً بالبايت
console.log(<code dir="ltr" style="background:#f3f4f6; color:#0056b3; padding:2px 6px; border-radius:4px; font-family:monospace; direction:ltr !important; display:inline-block;">اسم المضيف: ${os.hostname()}</code>); // يعرض اسم مضيف نظام التشغيل
console.log(<code dir="ltr" style="background:#f3f4f6; color:#0056b3; padding:2px 6px; border-radius:4px; font-family:monospace; direction:ltr !important; display:inline-block;">وقت التشغيل (ثواني): ${os.uptime()}</code>); // يعرض مدة تشغيل النظام بالثواني
تُعد وحدة os ضرورية لتطبيقات الخادم التي تحتاج إلى التكيف مع بيئات تشغيل مختلفة أو لجمع بيانات حول أداء النظام.
الخطوة 2: التعامل مع مسارات الملفات باستخدام وحدة path
تُسهل وحدة path التعامل مع مسارات الملفات والمجلدات بطريقة موحدة عبر أنظمة التشغيل المختلفة. سنتعلم كيفية ضم المسارات، استخراج أجزائها، وتحديد المسارات المطلقة.
const path = require('path'); // استيراد وحدة path للتعامل مع مسارات الملفات
const filePath = '/users/john/documents/report.txt'; // مسار ملف افتراضي
console.log('\nمعالجة مسارات الملفات:');
console.log(<code dir="ltr" style="background:#f3f4f6; color:#0056b3; padding:2px 6px; border-radius:4px; font-family:monospace; direction:ltr !important; display:inline-block;">اسم المجلد الأب: ${path.dirname(filePath)}</code>); // يستخرج اسم المجلد الذي يحتوي على الملف
console.log(<code dir="ltr" style="background:#f3f4f6; color:#0056b3; padding:2px 6px; border-radius:4px; font-family:monospace; direction:ltr !important; display:inline-block;">اسم الملف الأساسي: ${path.basename(filePath)}</code>); // يستخرج اسم الملف مع الامتداد
console.log(<code dir="ltr" style="background:#f3f4f6; color:#0056b3; padding:2px 6px; border-radius:4px; font-family:monospace; direction:ltr !important; display:inline-block;">اسم الملف بدون امتداد: ${path.basename(filePath, '.txt')}</code>); // يستخرج اسم الملف بدون امتداد معين
console.log(<code dir="ltr" style="background:#f3f4f6; color:#0056b3; padding:2px 6px; border-radius:4px; font-family:monospace; direction:ltr !important; display:inline-block;">امتداد الملف: ${path.extname(filePath)}</code>); // يستخرج امتداد الملف
console.log(<code dir="ltr" style="background:#f3f4f6; color:#0056b3; padding:2px 6px; border-radius:4px; font-family:monospace; direction:ltr !important; display:inline-block;">تحليل المسار: ${JSON.stringify(path.parse(filePath), null, 2)}</code>); // يحلل المسار إلى كائن يحتوي على أجزائه
استخدامpath.join()وpath.resolve()أمر بالغ الأهمية لتجنب مشكلات التوافق بين أنظمة التشغيل المختلفة (مثل الفواصل المائلة/في Linux و\في Windows).
الخطوة 3: بناء مسارات آمنة ومطلقة باستخدام path.join و path.resolve
سنستكشف الآن أهم دوال وحدة path لإنشاء مسارات آمنة وموثوقة، وهي path.join() و path.resolve().
const path = require('path'); // إعادة استيراد path للتوضيح
const currentDir = process.cwd(); // الحصول على المسار الحالي لتشغيل السكربت
console.log('\nبناء مسارات آمنة:');
// دمج أجزاء المسار بطريقة آمنة ومتوافقة مع نظام التشغيل
const joinedPath = path.join(currentDir, 'data', 'config.json');
console.log(<code dir="ltr" style="background:#f3f4f6; color:#0056b3; padding:2px 6px; border-radius:4px; font-family:monospace; direction:ltr !important; display:inline-block;">مسار مدمج: ${joinedPath}</code>);
// تحويل المسار النسبي إلى مسار مطلق
const resolvedPath = path.resolve('temp', 'logs', 'app.log');
console.log(<code dir="ltr" style="background:#f3f4f6; color:#0056b3; padding:2px 6px; border-radius:4px; font-family:monospace; direction:ltr !important; display:inline-block;">مسار مطلق: ${resolvedPath}</code>);
// مثال على مسار نسبي
const relativePath = './assets/images/logo.png';
console.log(<code dir="ltr" style="background:#f3f4f6; color:#0056b3; padding:2px 6px; border-radius:4px; font-family:monospace; direction:ltr !important; display:inline-block;">مسار عادي: ${relativePath}</code>);
// تحويل المسار النسبي إلى مسار مطلق بدءاً من المجلد الحالي
const absoluteRelativePath = path.resolve(relativePath);
console.log(<code dir="ltr" style="background:#f3f4f6; color:#0056b3; padding:2px 6px; border-radius:4px; font-family:monospace; direction:ltr !important; display:inline-block;">مسار مطلق من نسبي: ${absoluteRelativePath}</code>);
path.join()يدمج أجزاء المسار وينظم الفواصل بشكل صحيح.path.resolve()يحول المسار النسبي إلى مطلق، معالجة '..' و '.' بشكل صحيح، ويستخدم المسار الحالي كمرجع إذا لم يتم توفير مسار جذري.
الكود النهائي الكامل
إليك السكربت كاملاً، والذي يجمع جميع الأمثلة التي تناولناها:
const os = require('os'); // استيراد وحدة os
const path = require('path'); // استيراد وحدة path
// الخطوة 1: استكشاف معلومات نظام التشغيل
console.log('--- معلومات نظام التشغيل ---');
console.log(<code dir="ltr" style="background:#f3f4f6; color:#0056b3; padding:2px 6px; border-radius:4px; font-family:monospace; direction:ltr !important; display:inline-block;">نوع المنصة: ${os.platform()}</code>);
console.log(<code dir="ltr" style="background:#f3f4f6; color:#0056b3; padding:2px 6px; border-radius:4px; font-family:monospace; direction:ltr !important; display:inline-block;">بنية المعالج: ${os.arch()}</code>);
console.log(<code dir="ltr" style="background:#f3f4f6; color:#0056b3; padding:2px 6px; border-radius:4px; font-family:monospace; direction:ltr !important; display:inline-block;">إجمالي الذاكرة (بايت): ${os.totalmem()}</code>);
console.log(<code dir="ltr" style="background:#f3f4f6; color:#0056b3; padding:2px 6px; border-radius:4px; font-family:monospace; direction:ltr !important; display:inline-block;">الذاكرة الحرة (بايت): ${os.freemem()}</code>);
console.log(<code dir="ltr" style="background:#f3f4f6; color:#0056b3; padding:2px 6px; border-radius:4px; font-family:monospace; direction:ltr !important; display:inline-block;">اسم المضيف: ${os.hostname()}</code>);
console.log(<code dir="ltr" style="background:#f3f4f6; color:#0056b3; padding:2px 6px; border-radius:4px; font-family:monospace; direction:ltr !important; display:inline-block;">وقت التشغيل (ثواني): ${os.uptime()}</code>);
console.log(<code dir="ltr" style="background:#f3f4f6; color:#0056b3; padding:2px 6px; border-radius:4px; font-family:monospace; direction:ltr !important; display:inline-block;">مجلد المستخدم الرئيسي: ${os.homedir()}</code>); // مثال إضافي: مجلد المستخدم الرئيسي
console.log(<code dir="ltr" style="background:#f3f4f6; color:#0056b3; padding:2px 6px; border-radius:4px; font-family:monospace; direction:ltr !important; display:inline-block;">المسار المؤقت الافتراضي: ${os.tmpdir()}</code>); // مثال إضافي: المسار المؤقت الافتراضي
// الخطوة 2: التعامل مع مسارات الملفات
console.log('\n--- معالجة مسارات الملفات ---');
const filePath = '/users/john/documents/report.txt'; // مسار ملف افتراضي
console.log(<code dir="ltr" style="background:#f3f4f6; color:#0056b3; padding:2px 6px; border-radius:4px; font-family:monospace; direction:ltr !important; display:inline-block;">اسم المجلد الأب: ${path.dirname(filePath)}</code>);
console.log(<code dir="ltr" style="background:#f3f4f6; color:#0056b3; padding:2px 6px; border-radius:4px; font-family:monospace; direction:ltr !important; display:inline-block;">اسم الملف الأساسي: ${path.basename(filePath)}</code>);
console.log(<code dir="ltr" style="background:#f3f4f6; color:#0056b3; padding:2px 6px; border-radius:4px; font-family:monospace; direction:ltr !important; display:inline-block;">اسم الملف بدون امتداد: ${path.basename(filePath, '.txt')}</code>);
console.log(<code dir="ltr" style="background:#f3f4f6; color:#0056b3; padding:2px 6px; border-radius:4px; font-family:monospace; direction:ltr !important; display:inline-block;">امتداد الملف: ${path.extname(filePath)}</code>);
console.log(<code dir="ltr" style="background:#f3f4f6; color:#0056b3; padding:2px 6px; border-radius:4px; font-family:monospace; direction:ltr !important; display:inline-block;">تحليل المسار: ${JSON.stringify(path.parse(filePath), null, 2)}</code>);
// الخطوة 3: بناء مسارات آمنة ومطلقة
console.log('\n--- بناء مسارات آمنة ومطلقة ---');
const currentDir = process.cwd(); // الحصول على المسار الحالي
const joinedPath = path.join(currentDir, 'data', 'config.json');
console.log(<code dir="ltr" style="background:#f3f4f6; color:#0056b3; padding:2px 6px; border-radius:4px; font-family:monospace; direction:ltr !important; display:inline-block;">مسار مدمج (path.join): ${joinedPath}</code>);
// مثال: دمج مسار نسبي
const relativeParts = ['subfolder', 'another', 'file.log'];
const joinedRelativePath = path.join(currentDir, ...relativeParts);
console.log(<code dir="ltr" style="background:#f3f4f6; color:#0056b3; padding:2px 6px; border-radius:4px; font-family:monospace; direction:ltr !important; display:inline-block;">مسار نسبي مدمج: ${joinedRelativePath}</code>);
// مثال: تحويل مسار نسبي إلى مطلق
const resolvedPath = path.resolve('temp', 'logs', 'app.log');
console.log(<code dir="ltr" style="background:#f3f4f6; color:#0056b3; padding:2px 6px; border-radius:4px; font-family:monospace; direction:ltr !important; display:inline-block;">مسار مطلق (path.resolve): ${resolvedPath}</code>);
// مثال: تحويل مسار نسبي إلى مطلق بدءاً من المجلد الحالي
const relativeFilePath = './assets/images/logo.png';
const absoluteRelativePath = path.resolve(relativeFilePath);
console.log(<code dir="ltr" style="background:#f3f4f6; color:#0056b3; padding:2px 6px; border-radius:4px; font-family:monospace; direction:ltr !important; display:inline-block;">مسار مطلق من نسبي (path.resolve): ${absoluteRelativePath}</code>);
// مثال: تحديد ما إذا كان المسار مطلقاً
console.log(<code dir="ltr" style="background:#f3f4f6; color:#0056b3; padding:2px 6px; border-radius:4px; font-family:monospace; direction:ltr !important; display:inline-block;">هل المسار '/users/john' مطلق؟ ${path.isAbsolute('/users/john')}</code>);
console.log(<code dir="ltr" style="background:#f3f4f6; color:#0056b3; padding:2px 6px; border-radius:4px; font-family:monospace; direction:ltr !important; display:inline-block;">هل المسار 'data/config.json' مطلق؟ ${path.isAbsolute('data/config.json')}</code>);
النتيجة المتوقعة
عند تشغيل السكربت باستخدام Node.js (مثلاً: node your_script_name.js)، ستظهر لك على الطرفية معلومات مفصلة عن نظام التشغيل الذي تعمل عليه، بالإضافة إلى أمثلة واضحة لكيفية معالجة مسارات الملفات ودمجها وتحويلها إلى مسارات مطلقة. ستختلف بعض النتائج (مثل المسارات المطلقة وقيم الذاكرة واسم المضيف) بناءً على نظام التشغيل والبيئة التي يتم فيها تشغيل السكربت.
مثال على جزء من الإخراج المتوقع (قد يختلف بناءً على نظامك):
--- معلومات نظام التشغيل ---
نوع المنصة: linux
بنية المعالج: x64
إجمالي الذاكرة (بايت): 16777216000
الذاكرة الحرة (بايت): 8388608000
اسم المضيف: my-server-name
وقت التشغيل (ثواني): 1234567
مجلد المستخدم الرئيسي: /home/user
المسار المؤقت الافتراضي: /tmp
--- معالجة مسارات الملفات ---
اسم المجلد الأب: /users/john/documents
اسم الملف الأساسي: report.txt
اسم الملف بدون امتداد: report
امتداد الملف: .txt
تحليل المسار: {
"root": "/",
"dir": "/users/john/documents",
"base": "report.txt",
"ext": ".txt",
"name": "report"
}
--- بناء مسارات آمنة ومطلقة ---
مسار مدمج (path.join): /path/to/current/directory/data/config.json
مسار نسبي مدمج: /path/to/current/directory/subfolder/another/file.log
مسار مطلق (path.resolve): /path/to/current/directory/temp/logs/app.log
مسار مطلق من نسبي (path.resolve): /path/to/current/directory/assets/images/logo.png
هل المسار '/users/john' مطلق؟ true
هل المسار 'data/config.json' مطلق؟ false