1. التحليل الافتتاحي
وحدة نظام الملفات هي مجموعة بسيطة معبأة من طرق تشغيل ملف POSIX القياسي. يمكن الحصول على الوحدة النمطية عن طريق الاتصال ("FS"). جميع الطرق في وحدة نظام الملفات متوفرة في الإصدارات غير المتزامنة والمتزامنة.
(1) تتطلب الطريقة غير المتزامنة في وحدة نظام الملفات وظيفة رد اتصال مكتملة كآخر معلمة رسمية واردة.
(2) يتم تحديد تكوين وظيفة رد الاتصال بالطريقة غير المتزامنة المسمى. بشكل عام ، المعلمة الرسمية الأولى لوظيفة رد الاتصال هي رسالة الخطأ التي تم إرجاعها.
(3) إذا تم تنفيذ العملية غير المتزامنة بشكل صحيح وإرجاعها ، فإن المعلمة الرسمية للخطأ لاغية أو غير محددة. إذا كنت تستخدم الإصدار المتزامن من طريقة العملية ، بمجرد حدوث خطأ ، سيتم إرجاع خطأ في النموذج المعتاد لإلقاء خطأ.
(4) يمكنك استخدام محاولة التقاط البيانات لاعتراض الأخطاء وجعل البرنامج متابعة.
دعونا أولاً نلقي نظرة على مثال بسيط ، اقرأ الملف ("bb.txt"):
(1) قم بإنشاء ملف "bb.txt" ، على النحو التالي ("مرحبًا بالجميع ، أنا nobita! (*^__^*) Hehe ...").
(2) ، اقرأ عملية الملف على النحو التالي:
نسخة الكود كما يلي:
var fs = require ("fs") ؛
fs.readfile ("bb.txt" ، "utf8" ، الدالة (خطأ ، البيانات) {
إذا (خطأ) رمي الخطأ ؛
console.log (البيانات) ؛
}) ؛
نتائج التشغيل:
ما تحتاج إلى ملاحظته هنا هو: يجب عليك تعيين الترميز عند قراءة الملفات ، وإلا فإن النموذج الافتراضي سيظهر في "Buffer".
بالنظر إلى تأثير الجري الذي لم يتم تعيينه ، لا يزال الفرق واضحًا للغاية. على النحو التالي:
عملية كتابة أخرى ، على النحو التالي:
نسخة الكود كما يلي:
var fs = require ("fs") ؛
var txt = "يجب أن يتعلم الجميع nodejs !!!" ؛
// اكتب إلى ملف
fs.writefile ("bb.txt" ، txt ، function (err) {
إذا (خطأ) رمي خطأ ؛
console.log ("تم حفظ الملف!") ؛ // تم حفظ الملف
}) ؛
نتائج التشغيل:
فيما يلي بعض الأمثلة الشائعة:
نسخة الكود كما يلي:
// حذف الملف
fs.unlink ('bb.txt' ، function () {
console.log ('Success') ؛
}) ؛
// تعديل اسم الملف
fs.rename ('bb.txt' ، 'bigbear.txt' ، function (err) {
console.log ("إعادة تسمية النجاح") ؛
}) ؛
// تحقق من حالة الملف
fs.stat ('bb.txt' ، الدالة (err ، stat) {
console.log (STAT) ؛
}) ؛
// تحديد ما إذا كان الملف موجودًا
fs.exists ('bb.txt' ، الدالة (موجودة) {
console.log (موجود) ؛
}) ؛
2. العلاقة بين FS والتيار
"تيار" له ميزات غير متزامنة. هل يمكنني تقسيم ملف أو قطعة من المحتوى إلى "قطع" غير معروفة وقراءته ، وفي كل مرة يتم فيها قراءة "قطعة" ، نخرجه. حتى يتم الانتهاء من الملف. هذا يشبه "ترميز النقل: قطعة" مدعومة بـ "http1.1". (يمكن أن توجد "قطعة" بأي شكل من الأشكال ، موجودة في شكل "مخزن مؤقت" افتراضيًا ، وهو أكثر كفاءة). يحتوي "Stream" في NodeJS على ميزة فائقة على أنظمة UNIX ، وهي ("Pipe" ------ خط أنابيب).
هل ما زلت تتذكر برنامج Nodejs الأول "Hello ، Big Bear!"؟ نقوم ببعض التعديلات على أساس التطبيق ، على النحو التالي:
(1) ، إنشاء "BB.HTML"
نسخة الكود كما يلي:
<html>
<head>
<type type = "text/css">
ديف {
الهامش: 50 بكسل ؛
العرض: 100 ٪ ؛
الهامش: 0px ؛
الارتفاع: 120 بكسل ؛
ارتفاع الخط: 120 بكسل ؛
اللون: #ffff ؛
حجم الخط: 22px ؛
الخلفية:#ff9900 ؛
محاذاة النص: المركز ؛
}
</style>
</head>
<body>
<viv> مرحبًا ، دب كبير! </div>
</body>
</html>
(2) ، قم بتعديل البرنامج السابق على النحو التالي:
نسخة الكود كما يلي:
var http = require ('http') ؛
var fs = require ("fs") ؛
var server = http.createserver (function (req ، res) {
fs.readfile ("bb.html" ، "UTF-8" ، Function (err ، data) {
إذا (خطأ) {
Res.Writehead (500 ، {'context-type': 'text/plain'}) ؛
res.end ('حدد الملف غير موجود! أو خطأ الخادم!') ؛
}
آخر{
Res.Writehead (200 ، {'context-type': 'text/html'}) ؛
Res.Write (البيانات) ؛
res.end () ؛
}
})
}) ؛
server.listen (8888) ؛
console.log ("HTTP Server قيد التشغيل على المنفذ 8888 ...") ؛
فيما يلي نتائج التشغيل:
الآن نحتاج إلى التفكير في الأمر ، إذا لم نرسل ملفًا نصيًا بسيطًا ولكن ملفًا Hyper Mediveia ، مثل ملف الفيديو HD الكامل لمؤتمر Google 2014 IO. تنسيق MP4. الطول أكثر من 2 ساعة 1080 بكسل.
حوالي 4 جيجابايت. طريقة "Readfile" معروفة بالعمل هي قراءة الملفات في الذاكرة. ثم من الواضح أن مثل هذا الملف الكبير لا يمكن القيام به. إذن ماذا علي أن أفعل؟ بعد ذلك ، تحتاج إلى استخدام الدفق للقيام بذلك. هذا كل شيء.
الرمز كما يلي:
نسخة الكود كما يلي:
fs.createadStream (__ dirname + '/violdio.mp4''m'mnymnmelreats) ؛
لتلخيص:
يمكن لهذه الرموز تنفيذ الوظائف المطلوبة ، لكن الخدمة تحتاج إلى تخزين بيانات الملف بأكملها إلى الذاكرة قبل إرسال بيانات الملف ، إذا كان ملف "bb.html" شديدًا
إذا كانت كبيرة ولديها تزامن كبير ، فسيتم إهدار الكثير من الذاكرة. نظرًا لأن المستخدم يحتاج إلى الانتظار حتى يتم تخزين الملف بالكامل إلى الذاكرة لقبول بيانات الملف ، فإن هذا يؤدي إلى
تجربة المستخدم سيئة للغاية. لحسن الحظ ، كل من المعلمتين "(REQ ، RES)" هي دفق ، حتى نتمكن من استخدام Fs.CreeCreeDstream () بدلاً من "fs.readfile ()".
ثلاثة ، أمثلة
تعال لتحميل ملف:
(1) إنشاء "server.js"
نسخة الكود كما يلي:
var http = require ('http') ؛
var url = require ('url') ؛
وظيفة البدء (المسار ، المعالج) {
وظيفة onrequest (طلب ، استجابة) {
var pathname = url.parse (request.url) .PathName ؛
// طريق إلى منطق الأعمال المقابل
الطريق (اسم المسار ، المعالج ، الرد ، الطلب) ؛
}
http.createserver (onrequest) .Listen (3000) ؛
console.log ("الخادم يبدأ") ؛
}
orports.start = start ؛
(2) إنشاء "route.js"
نسخة الكود كما يلي:
طريق الوظيفة (اسم المسار ، المعالج ، الاستجابة ، الطلب) {
console.log ('على وشك توجيه طلب لـ " + pathname) ؛
if (typeof handler [pathname] === 'function') {
معالج الإرجاع [pathname] (الرد ، الطلب) ؛
} آخر {
console.log ("لم يتم العثور على معالج طلب لـ" + pathname) ؛
Response.writehead (404 ، {'content-type': 'text/html'}) ؛
استجابة. write ('404 لم يتم العثور عليها!') ؛
استجابة.
}
}
orports.route = الطريق ؛
(3) إنشاء "requestHandler.js"
نسخة الكود كما يلي:
var QueryString = require ('QueryString') ،
fs = require ('fs') ،
هائل = يتطلب ('هائل') ؛
وظيفة بدء (استجابة ، طلب) {
console.log ('start module') ؛
var body = '<html>'+
'<head>'+
"<meta http-equiv =" content-type "'+
"content =" text /html ؛ charset = utf-8 " /> '+
'</head>'+
'<body>'+
'<form action = "/upload" enctype = "multipart/form-data" method = "post">'+
'<إدخال type = "file" name = "upload" multives = "multives">'+
'<إدخال نوع = "إرسال" value = "إرسال النص" />'+
'</form>'+
'</body>'+
'</html>' ؛
Response.writehead (200 ، {'content-type': 'text/html'}) ؛
استجابة. write (الجسم) ؛
استجابة.
}
تحميل الوظيفة (استجابة ، طلب) {
console.log ('Upload Module') ؛
var form = new MOPIDIDABLE.INCOMINGFORM () ؛
form.parse (طلب ، وظيفة (خطأ ، الحقول ، الملفات) {
fs.renamesync (files.upload.path ، '/tmp/test.png') ؛
Response.writehead (200 ، {'content-type': 'text/html'}) ؛
Response.write ('you /' ve sent: <br /> ') ؛
Response.write ('<img src = " /show" />') ؛
استجابة.
}) ؛
}
عرض الوظيفة (استجابة ، طلب) {
console.log ('show module') ؛
fs.readfile ('/tmp/test.png' ، 'binary' ، function (error ، file) {
إذا (خطأ) {
Response.writehead (200 ، {'content-type': 'text/html'}) ؛
استجابة. write (خطأ) ؛
استجابة.
} آخر {
Response.writehead (200 ، {'content-type': 'Image/Png'}) ؛
Response.write (ملف ، 'binary') ؛
استجابة.
}
}) ؛
}
orports.start = start ؛
orports.upload = تحميل ؛
exports.show = show ؛
(4) ، إنشاء "index.js"
نسخة الكود كما يلي:
var server = require ('./ server') ؛
var Router = require ('./ Router') ؛
var requestHandler = require ('./ requestHandler') ؛
var dividable = require ('dividable') ؛ // تتطلب خوارزمية بحث المسار؟ ؟
var handler = {} ؛
معالج ['/'] = requestHandler.start ؛
معالج ['/start'] = requestHandler.start ؛
معالج ['/expload'] = requestHandler.upload ؛
معالج ['/show'] = requestHandler.show ؛
Server.start (Router.Route ، Handler) ؛
أربعة ، دعونا نلخص
(1) فهم "العلاقة بين FS والتيار".
(2) كفاءة في استخدام واجهات برمجة التطبيقات ذات الصلة "FS".
(3) انتبه إلى التفاصيل ، مثل: تفاصيل المعالجة بين طريقة مزامنة واجهة برمجة تطبيقات تشغيل الملفات والطريقة غير المتزامنة.
(4) ، وأؤكد أخيرًا: فهم طريقة تنظيم التعليمات البرمجية في أمثلة تحميل الملفات ، وإعادة تشكيلها باستمرار ، وتلخيص باستمرار.