تحتوي Node على مجموعة من واجهات برمجة تطبيقات دفق البيانات التي يمكنها معالجة ملفات مثل معالجة تدفقات الشبكة ، وهي مريحة للغاية للاستخدام ، ولكنها تسمح فقط بمعالجة الملفات بشكل متتابع ولا يمكن قراءة الملفات وكتابةها بشكل عشوائي. لذلك ، يجب استخدام بعض عمليات نظام الملفات الأساسية.
يغطي هذا الفصل أساسيات معالجة الملفات ، بما في ذلك كيفية فتح ملف ، وقراءة جزء من ملف ، وكتابة البيانات ، وإغلاق ملف.
العديد من واجهات برمجة تطبيقات ملف Node هي تقريبًا نسخة طبق الأصل من واجهة برمجة تطبيقات الملف المقابلة في UNIX (POSIX). على سبيل المثال ، يتم استخدام طريقة استخدام واصفات الملفات. تمامًا كما هو الحال في UNIX ، يعد واصف الملف أيضًا رقمًا صحيحًا في العقدة ، ويمثل فهرس كيان في جدول واصف الملف.
هناك 3 واصفات ملفات خاصة - 1 و 2 و 3. وهي تمثل الإدخال القياسي والإخراج القياسي وواصف ملف الخطأ القياسي ، على التوالي. الإدخال القياسي ، كما يوحي الاسم ، هو دفق للقراءة فقط ، والذي تستخدم العمليات لقراءة البيانات من وحدة التحكم أو قناة العملية. الإخراج القياسي والأخطاء القياسية هي واصفات الملفات المستخدمة فقط لإخراج البيانات. غالبًا ما يتم استخدامها لإخراج البيانات إلى لوحات المفاتيح أو العمليات أو الملفات الأخرى. الأخطاء القياسية مسؤولة عن إخراج رسالة الخطأ ، في حين أن الإخراج القياسي مسؤول عن إخراج العملية العادية.
بمجرد بدء العملية ، يمكن استخدام واصفات الملفات هذه ، ولا تحتوي في الواقع على ملفات مادية مقابلة. لا يمكنك قراءة وكتابة البيانات في موقع عشوائي. (ملاحظة المترجم: النص الأصلي هو أنه يمكنك الكتابة إلى مواضع محددة وقراءةها داخل الملف. بناءً على السياق ، ربما يكون المؤلف قد كتب أقل "لا") ، ويمكنه فقط القراءة والإخراج بالتسلسل مثل تدفقات بيانات شبكة التشغيل ، ولا يمكن تعديل البيانات المكتوبة.
لا تخضع الملفات العادية لهذا القيد. على سبيل المثال ، في العقدة ، يمكنك إنشاء ملفات يمكنها فقط إلحاق البيانات بالذيل ، ويمكنك أيضًا إنشاء ملفات تقرأ وكتابة مواقع عشوائية.
تتضمن جميع العمليات المتعلقة بالملفات تقريبًا معالجة مسارات الملفات. سيقدم هذا الفصل أولاً وظائف الأداة هذه ، ثم شرح عمليات قراءة الملفات والكتابة وبيانات التعمق.
مسار الملف
تنقسم مسارات الملف إلى نوعين: المسارات النسبية والمسارات المطلقة ، وتستخدم لتمثيل ملفات محددة. يمكنك دمج مسارات الملفات ، واستخراج معلومات اسم الملف ، وحتى اكتشاف ما إذا كان الملف موجودًا.
في العقدة ، يمكنك استخدام السلاسل لمعالجة مسارات الملفات ، ولكن هذا سيؤدي إلى تعقيد المشكلة. على سبيل المثال ، تريد توصيل أجزاء مختلفة من المسار ، وتنتهي بعض الأجزاء بـ "/" ولكن بعضها لا ، وقد يكون تقسيم المسار مختلفًا أيضًا في أنظمة التشغيل المختلفة ، لذلك عندما تقوم بتوصيلها ، سيكون الرمز أمرًا ومزعجًا للغاية.
لحسن الحظ ، تحتوي العقدة على وحدة نمطية تسمى المسار يمكن أن تساعدك في توحيد المسارات والتوصيل وتحليلها ، وتحويلها من المسارات المطلقة إلى المسارات النسبية ، واستخراج أجزاء مختلفة من المعلومات من المسارات ، واكتشاف ما إذا كان الملف موجودًا. بشكل عام ، تكون وحدة المسار في الواقع مجرد معالجة سلسلة ، ولن تذهب إلى نظام الملفات للتحقق (استثناء وظيفة path.exists).
توحيد المسارات
عادة ما يكون تطبيعها قبل تخزين أو استخدام المسارات فكرة جيدة. على سبيل المثال ، يجب توحيد مسارات الملفات التي تم الحصول عليها بواسطة ملفات المستخدم أو ملفات التكوين ، أو المسارات المتصلة بمسارين أو أكثر ، عمومًا. يمكن تطبيع المسار باستخدام وظيفة تطبيع وحدة المسار ، ويمكنه أيضًا التعامل مع ".." ، "." // ". على سبيل المثال:
نسخة الكود كما يلي:
var path = required ('path') ؛
path.normalization ('/foo/bar // baz/asdf/quux/..') ؛
// => '/foo/bar/baz/asdf'
مسار الاتصال
باستخدام وظيفة path.join () ، يمكنك تسلسل أكبر عدد من سلاسل المسار. يمكنك فقط تمرير جميع سلاسل المسار إلى وظيفة Join () بالتسلسل:
نسخة الكود كما يلي:
var path = required ('path') ؛
path.join ('/foo' ، 'bar' ، 'baz/asdf' ، 'quux' ، '..') ؛
// => '/foo/bar/baz/asdf'
كما ترون ، فإن path.join () سوف يقوم تلقائيًا بتطبيع المسار في الداخل.
طريق
استخدم path.resolve () لحل مسارات متعددة في مسار مطلق. وظيفتها تشبه عمليات "CD" واحدة تلو الأخرى على هذه المسارات. على عكس معلمات أمر القرص المضغوط ، يمكن أن تكون هذه المسارات ملفات ، ولا يجب أن تكون موجودة في الحياة الحقيقية - لن تصل طريقة المسار.
على سبيل المثال:
نسخة الكود كما يلي:
var path = required ('path') ؛
path.resolve ('/foo/bar' ، './baz') ؛
// =>/foo/bar/baz
path.resolve ('/foo/bar' ، '/tmp/file/') ؛
// =>/tmp/file
إذا لم تكن نتيجة التحليل مسارًا مطلقًا ، فسيقوم Resolve.Resolve () بإلحاق دليل العمل الحالي كمسار إلى نتيجة التحليل ، على سبيل المثال:
نسخة الكود كما يلي:
path.resolve ('wwwroot' ، 'static_files/png/' ، '../gif/image.gif') ؛
// إذا كان دليل العمل الحالي هو/المنزل/نفسي/العقدة ، فسوف يعود
// => /home/myself/node/wwwroot/static_files/gif/image.gif '
حساب المسارات النسبية لمسارين مطلقين
يمكن أن يخبرك path.relative () إذا كنت تقفز من عنوان مطلق إلى عنوان مطلق آخر ، على سبيل المثال:
نسخة الكود كما يلي:
var path = required ('path') ؛
path.ration ('/data/orandea/test/aaa' ، '/data/orandea/imment/bbb') ؛
// => ../../impl/bbb
استخراج البيانات من المسار
خذ المسار "/foo/bar/myfile.txt" كمثال. إذا كنت ترغب في الحصول على جميع محتويات الدليل الأصل (/FOO/BAR) ، أو قراءة ملفات أخرى من نفس الدليل ، فيجب عليك استخدام PATH.DIRNAME (FILEPATH) للحصول على جزء الدليل من مسار الملف ، مثل:
نسخة الكود كما يلي:
var path = required ('path') ؛
path.dirname ('/foo/bar/baz/asdf/quux.txt') ؛
// =>/foo/bar/baz/asdf
أو ، إذا كنت ترغب في الحصول على اسم الملف من مسار الملف ، أي الجزء الأخير من مسار الملف ، يمكنك استخدام وظيفة path.basename:
نسخة الكود كما يلي:
var path = required ('path') ؛
path.basename ('/foo/bar/baz/asdf/quux.html')
// => quux.html
قد يحتوي مسار الملف أيضًا على امتداد ملف ، وعادةً ما يكون جزء السلسلة بعد الأخير ". الحرف في اسم الملف.
يمكن أن يقبل path.basename أيضًا سلسلة اسم التمديد كمعلمة ثانية ، بحيث يقوم اسم الملف الذي تم إرجاعه تلقائيًا بإزالة الامتداد ، وإرجاع جزء الاسم فقط من الملف:
نسخة الكود كما يلي:
var path = required ('path') ؛
path.basename ('/foo/bar/baz/asdf/quux.html' ، '.html') ؛
// => Quux
للقيام بذلك ، يجب أولاً معرفة ملحق الملف. يمكنك استخدام path.extName () للحصول على التمديد:
نسخة الكود كما يلي:
var path = required ('path') ؛
path.extName ('/a/b/index.html') ؛
// => '.html'
path.extName ('/a/bc/index') ؛
// => ''
path.extName ('/a/bc/.') ؛
// => ''
path.extName ('/a/bc/d.') ؛
// => '.'
تحقق مما إذا كان المسار موجودًا
حتى الآن ، لا علاقة لعمليات معالجة المسار المذكورة أعلاه بنظام الملفات الأساسي ، ولكنها مجرد بعض عمليات السلسلة. ومع ذلك ، في بعض الأحيان تحتاج إلى تحديد ما إذا كان مسار الملف موجودًا. على سبيل المثال ، في بعض الأحيان تحتاج إلى تحديد ما إذا كان هناك ملف أو دليل. إذا لم يكن موجودًا ، فيمكنك استخدام path.exsits ():
نسخة الكود كما يلي:
var path = required ('path') ؛
path.exists ('/etc/passwd' ، وظيفة (موجودة) {
console.log ("موجود:" ، موجود) ؛
// => صحيح
}) ؛
path.exists ('/do_not_exist' ، الدالة (موجودة) {
console.log ("موجود:" ، موجود) ؛
// => خطأ
}) ؛
ملاحظة: بدءًا من إصدار Node0.8 ، تم نقله من وحدة المسار إلى وحدة FS وأصبح fs.exists. باستثناء مساحة الاسم ، لم يتغير أي شيء آخر:
نسخة الكود كما يلي:
var fs = require ('fs') ؛
fs.exists ('/do_not_exist' ، الدالة (موجودة) {
console.log ("موجود:" ، موجود) ؛
// => خطأ
}) ؛
path.exists () هي عملية I/O. لأنه غير متزامن ، مطلوب وظيفة رد الاتصال. عند إرجاع عملية الإدخال/الإخراج ، يتم استدعاء وظيفة رد الاتصال ويتم تمرير النتيجة إليها. يمكنك أيضًا استخدام نسخته المتزامنة من path.existssync () ، والتي لها نفس الوظيفة ، باستثناء أنها لا تسمي وظيفة رد الاتصال ، ولكنها تُرجع النتيجة مباشرة:
نسخة الكود كما يلي:
var path = required ('path') ؛
path.existssync ('/etc/passwd') ؛
// => صحيح
مقدمة لوحدة FS
تحتوي وحدة FS على جميع الوظائف ذات الصلة لاستعلام الملفات والمعالجة. باستخدام هذه الوظائف ، يمكنك الاستعلام عن معلومات الملفات والقراءة والكتابة وإغلاق الملفات. استيراد وحدة FS مثل هذا:
نسخة الكود كما يلي:
var fs = require ('fs')
معلومات ملف الاستعلام
في بعض الأحيان قد تحتاج إلى معرفة معلومات الملف مثل حجم الملف أو تاريخ الإنشاء أو الأذونات. يمكنك استخدام وظيفة fs.stath للاستعلام عن معلومات التعريف الخاصة بملف أو دليل:
نسخة الكود كما يلي:
var fs = require ('fs') ؛
fs.stat ('/etc/passwd' ، الدالة (err ، stats) {
if (err) {throw err ؛}
console.log (الإحصائيات) ؛
}) ؛
سيكون لهذا المقتطف الرمز إخراج مشابه لما يلي
نسخة الكود كما يلي:
{ديف: 234881026 ،
Ino: 95028917 ،
الوضع: 33188 ،
Nlink: 1 ،
UID: 0 ،
GID: 0 ،
RDEV: 0 ،
الحجم: 5086 ،
Blksize: 4096 ،
الكتل: 0 ،
atime: الجمعة ، 18 نوفمبر 2011 22:44:47 بتوقيت جرينتش ،
MTime: Thu ، 08 Sep 2011 23:50:04 GMT ،
Ctime: Thu ، 08 Sep 2011 23:50:04 GMT}
1. سوف تمرير استدعاء Fs.Stat () مثيلًا لفئة الإحصائيات كمعلمة إلى وظيفة رد الاتصال. يمكنك استخدام مثيل الإحصائيات مثل ما يلي:
2.stats.isfile () - إرجاع صحيح إذا كان ملفًا قياسيًا ، وليس دليلًا أو مقبسًا أو رابطًا أو جهازًا رمزيًا ، وإلا فاضنًا
3.stats.isdiretory () - إذا كان دليلًا ، فالرد ، عائدًا ، بطريقة خاطئة
4.stats.isblockdevice () - إرجاع صحيح إذا كان جهاز كتلة. في معظم أنظمة UNIX ، يكون جهاز الكتلة عادة في دليل /dev.
5.stats.ischracterdevice () - إرجاع صحيح إذا كان جهاز شخصية
6.stats.issymbolicklink () - إرجاع صحيح إذا كان رابط ملف
7.stats.isfifo () - إذا كان FIFO (نوع خاص من UNIX المسمى PIPE) يرجع true
8.Stats.issocket () - إذا كان مقبس UNIX (TODO: Googe IT)
افتح الملف
قبل قراءة ملف أو معالجته ، يجب أولاً استخدام وظيفة Fs.Open لفتح الملف ، ثم سيتم استدعاء وظيفة رد الاتصال التي تقدمها والحصول على واصف الملف. في وقت لاحق ، يمكنك استخدام واصف الملف لقراءة الملف المفتوح وكتابة:
نسخة الكود كما يلي:
var fs = require ('fs') ؛
fs.open ('/path/to/file' ، 'r' ، function (err ، fd) {
// حصلت على واصف ملف FD
}) ؛
المعلمة الأولى من Fs.Open هي مسار الملف ، والمعلمة الثانية هي بعض العلامات المستخدمة للإشارة في الوضع الذي يتم فتح الملف. يمكن أن تكون هذه العلامات R ، R+، W ، W+، A أو A+. فيما يلي شرح لهذه العلامات (من صفحة FOPEN في وثائق UNIX)
1.r - افتح الملف في وضع القراءة فقط ، يبدأ الموقع الأولي لتيار البيانات في الملف
2.R+ - افتح الملف بطريقة قابلة للقراءة وقابلة للكتابة ، ويبدأ الموقع الأولي لتيار البيانات في الملف
3.W - في حالة وجود الملف ، قم بمسح طول الملف بمقدار 0 ، أي ، سيتم فقد محتويات الملف. إذا لم يكن موجودًا ، فحاول إنشائها. يبدأ الموقع الأولي لتيار البيانات في الملف
4.W+ - افتح الملف بطريقة قابلة للقراءة وقابلة للكتابة. إذا لم يكن الملف موجودًا ، فحاول إنشائه. في حالة وجود الملف ، قم بمسح طول الملف بمقدار 0 ، أي ، سيتم فقد محتويات الملف. يبدأ الموقع الأولي لتيار البيانات في الملف
5.A - افتح الملف بطريقة الكتابة فقط. إذا لم يكن الملف موجودًا ، فحاول إنشائه. الموقع الأولي لتيار البيانات هو في نهاية الملف. كل عملية كتابة لاحقة تلحق البيانات إلى الجزء الخلفي من الملف.
6.A+ - افتح الملف بطريقة قابلة للقراءة وقابلة للكتابة. إذا لم يكن الملف موجودًا ، فحاول إنشائه. الموقع الأولي لتيار البيانات هو في نهاية الملف. ستقوم كل عملية كتابة لاحقة بإلحاق البيانات إلى الجزء الخلفي من الملف.
اقرأ الملف
بمجرد فتح الملف ، يمكنك البدء في قراءة محتويات الملف ، ولكن قبل البدء ، يجب عليك إنشاء مخزن مؤقت لوضع البيانات. سيتم تمرير هذا الكائن المخزن المؤقت إلى وظيفة FS.Read كمعلمة وسيتم ملؤها بالبيانات بواسطة FS.Read.
نسخة الكود كما يلي:
var fs = require ('fs') ؛
fs.open ('./ my_file.txt' ، 'r' ، وظيفة فتح (err ، fd) {
إذا (err) {throw err}
var readbuffer = New Buffer (1024) ،
bufferoffset = 0 ،
BufferLength = readbuffer.length ،
fileposition = 100 ؛
FS.Read (FD ،
readbuffer ،
المخزن المؤقت ،
الطول ،
fileposition ،
وظيفة قراءة (err ، readBytes) {
if (err) {throw err ؛ }
console.log ('upp read' + readBytes + 'bytes') ؛
if (readBytes> 0) {
console.log (readbuffer.slice (0 ، readBytes)) ؛
}
}) ؛
}) ؛
يحاول الرمز أعلاه فتح ملف. بعد فتحه بنجاح (استدعاء الوظيفة المفتوحة) ، يبدأ في طلب قراءة 1024 بايتات من البيانات التالية من البايت 100 من دفق الملف (السطر 11).
المعلمة الأخيرة من fs.read () هي وظيفة رد الاتصال (السطر 16). عندما تحدث الحالات الثلاثة التالية ، سيتم تسمية:
1. حدث خطأ
2. تم قراءة البيانات بنجاح
3. لا توجد بيانات للقراءة
في حالة حدوث خطأ ، ستوفر المعلمة الأولى (ERR) وظيفة رد الاتصال بكائن يحتوي على رسالة الخطأ ، وإلا فإن هذه المعلمة فارغة. إذا تمت قراءة البيانات بنجاح ، فستشير المعلمة الثانية (readBytes) إلى حجم البيانات التي يتم قراءتها في المخزن المؤقت. إذا كانت القيمة 0 ، فهذا يعني أنه تم الوصول إلى نهاية الملف.
ملاحظة: بمجرد تمرير الكائن المخزن المؤقت إلى fs.open () ، يتم نقل التحكم في الكائن العازلة إلى الأمر read. فقط عندما تسمى وظيفة رد الاتصال ، سيتم إرجاع التحكم في الكائن العازلة إليك. لذلك قبل ذلك ، لا تقرأ وتكتب أو تدع مكالمات الوظائف الأخرى تستخدم هذا الكائن المخزن المؤقت ؛ خلاف ذلك ، يمكنك قراءة البيانات غير المكتملة ، والأسوأ من ذلك ، يمكنك كتابة البيانات في هذا الكائن المخزن المؤقت بشكل متزامن.
اكتب ملف
تمرير كائن مخزن مؤقت يحتوي على بيانات عن طريق تمريره إلى fs.write () ، واكتب البيانات إلى ملف مفتوح:
نسخة الكود كما يلي:
var fs = require ('fs') ؛
fs.open ('./ my_file.txt' ، 'a' ، وظيفة فتح (err ، fd) {
if (err) {throw err ؛ }
var trintbuffer = new Buffer ('كتابة هذه السلسلة') ،
المخزن المؤقت = 0 ،
BufferLength = trintbuffer.length ، fileposition = null ؛
fs.write (FD ،
TriteBuffer ،
المخزن المؤقت ،
الطول ،
fileposition ،
وظيفة الكتابة (خطأ ، مكتوب) {
if (err) {throw err ؛ }
console.log ('كتب' + مكتوب + 'bytes') ؛
}) ؛
}) ؛
في هذا المثال ، يحاول السطر الثاني من التعليمات البرمجية فتح ملف في وضع إلحاق (أ) ، ثم السطر السابع من التعليمات البرمجية (ملاحظة المترجم: النص الأصلي هو 9) يكتب البيانات إلى الملف. يجب أن يكون الكائن العازلة مصحوبًا بعدة معلومات كمعلمات:
1. بيانات المخزن المؤقت
2. من أين تبدأ البيانات المراد كتابة في المخزن المؤقت
3. طول البيانات المراد كتابة
4. أين تكتب البيانات إلى الملف
5. وظيفة رد الاتصال تسمى بعد الانتهاء من العملية كتب
في هذا المثال ، تكون معلمة FilePostion خالية ، مما يعني أن وظيفة الكتابة ستكتب البيانات إلى الموقع الحالي لمؤشر الملف. نظرًا لأنه ملف تم فتحه في وضع الإلحاح ، يكون مؤشر الملف في نهاية الملف.
مثل عمليات القراءة ، لا تستخدم أي كائن عازلة وارد يتم استخدامه أثناء تنفيذ Fs.Write. بمجرد أن يبدأ Fs.write في التنفيذ ، فإنه يكتسب السيطرة على هذا الكائن العازلة. يمكنك الانتظار فقط حتى يتم استدعاء وظيفة رد الاتصال قبل إعادة استخدامها.
أغلق الملف
ربما لاحظت أنه حتى الآن ، فإن جميع الأمثلة في هذا الفصل ليس لها رمز لإغلاق الملف. نظرًا لأنها أمثلة صغيرة وبسيطة عند استخدامها مرة واحدة فقط ، يضمن نظام التشغيل إغلاق جميع الملفات عند انتهاء عملية العقدة.
ومع ذلك ، في التطبيق الفعلي ، بمجرد فتح الملف ، تريد التأكد من إغلاقه. للقيام بذلك ، تحتاج إلى تتبع جميع واصفات الملفات المفتوحة ثم الاتصال بـ fs.close (FD [، رد الاتصال]) عندما لم تعد تستخدم لإغلاقها في النهاية. إذا لم تنتبه ، فمن السهل تفويت واصف ملف معين. يوفر المثال التالي وظيفة تسمى OpenandWriteToSystemLog ، والتي توضح كيفية إغلاق الملفات بعناية:
نسخة الكود كما يلي:
var fs = require ('fs') ؛
وظيفة OpenandWriteToSystemLog (WriteBuffer ، رد الاتصال) {
fs.open ('./ my_file' ، 'a' ، وظيفة فتح (err ، fd) {
if (err) {return callback (err) ؛ }
دالة إخطار (err) {
fs.close (fd ، function () {
رد الاتصال (ERR) ؛
}) ؛
}
var bufferoffset = 0 ،
BufferLength = trintbuffer.length ،
fileposition = null ؛
fs.write (FD ، WriteBuffer ، BufferOffset ، BufferLength ، Fileposition ،
وظيفة الكتابة (خطأ ، مكتوب) {
if (err) {return notifyerror (err) ؛ }
fs.close (fd ، function () {
رد الاتصال (ERR) ؛
}) ؛
}
) ؛
}) ؛
}
OpenandWritetOsystemLog (
عازلة جديدة ("كتابة هذه السلسلة") ،
وظيفة تم (خطأ) {
إذا (خطأ) {
console.log ("خطأ أثناء الفتح والكتابة:" ، err.message) ؛
يعود؛
}
console.log ('كل شيء مع عدم وجود أخطاء') ؛
}
) ؛
هنا ، يتم توفير وظيفة تسمى OpenAndWriteToSystemLog ، والتي تقبل كائن عازلة يحتوي على البيانات المراد كتابة ، ودالة رد الاتصال تسمى بعد اكتمال العملية أو حدوث خطأ. في حالة حدوث خطأ ، ستحتوي المعلمة الأولى لوظيفة رد الاتصال على كائن الخطأ هذا.
لاحظ أن الوظيفة الداخلية للإخطار ، والتي تغلق الملف وتبلغ عن خطأ يحدث.
ملاحظة: حتى ذلك الحين ، أنت تعرف كيفية استخدام العمليات الذرية الأساسية لفتح الملفات والقراءة والكتابة وإغلاقها. ومع ذلك ، لدى Node أيضًا مجموعة أكثر تقدماً من المنشئين الذين يسمحون لك بمعالجة الملفات بطريقة أبسط.
على سبيل المثال ، تريد استخدام طريقة آمنة للسماح بعمليتين أو أكثر من عمليات الكتابة لإلحاق البيانات بملف بشكل متزامن ، ويمكنك استخدام WriteStream.
أيضًا ، إذا كنت ترغب في قراءة منطقة معينة من ملف ، فيمكنك التفكير في استخدام ReadStream. سيتم تقديم هاتين حالتين في الفصل 9 "قراءة وكتابة دفق البيانات".
ملخص
عند استخدام ملف ، تحتاج إلى معالجة معلومات مسار الملف واستخراجها في معظم الحالات. باستخدام وحدة المسار ، يمكنك توصيل المسارات ، وتوحيد المسارات ، وحساب اختلافات المسار ، وتحويل المسارات النسبية إلى مسارات مطلقة. يمكنك استخراج مكونات المسار مثل الامتدادات وأسماء الملفات والأدلة ، إلخ.
توفر Node مجموعة من واجهات برمجة التطبيقات الأساسية في وحدة FS للوصول إلى نظام الملفات ، ويستخدم واجهة برمجة التطبيقات الأساسية واصفات الملفات لمعالجة الملفات. يمكنك فتح الملف باستخدام Fs.Open ، وكتابة الملف باستخدام Fs.write ، وقراءة الملف باستخدام FS.Read ، وأغلق الملف باستخدام Fs.Close.
عند حدوث خطأ ، يجب عليك دائمًا استخدام منطق معالجة الأخطاء الصحيح لإغلاق الملف - للتأكد من إغلاق واصفات الملف المفتوحة قبل إرجاع المكالمة.