وصف الطريقة:
احصل على المسار الحقيقي.
يمكن حل المسارات النسبية باستخدام Process.cwd.
القواعد:
نسخة الكود كما يلي:
fs.realpath (المسار ، [ذاكرة التخزين المؤقت] ، [رد الاتصال (ERR ، ResolvedPath)]))
نظرًا لأن هذه الطريقة تنتمي إلى وحدة FS ، فمن الضروري تقديم وحدة FS قبل الاستخدام (var fs = require ("fs"))
تلقي المعلمات:
مسار المسار
ذاكرة التخزين المؤقت اختياريًا ، يمكن استخدام مسار معين محدد لإجبار مسار معين لحل أو تجنب Fs.Stat الإضافية إلى معرفة كائن المسار الحقيقي.
رد الاتصال رد الاتصال
استثناء يخطئ
عنوان ResolvedPath الحقيقي
مثال:
نسخة الكود كما يلي:
var cache = {'/etc': '/private/etc'} ؛
fs.realpath ('/etc/passwd' ، ذاكرة التخزين المؤقت ، الدالة (err ، ResolvedPath) {
إذا (خطأ) رمي خطأ ؛
console.log (ResolvedPath) ؛
}) ؛
رمز المصدر:
نسخة الكود كما يلي:
fs.realpath = وظيفة realpath (p ، ذاكرة التخزين المؤقت ، cb) {
if (! util.ispunction (CB)) {
cb = maybecallback (ذاكرة التخزين المؤقت) ؛
ذاكرة التخزين المؤقت = فارغة ؛
}
// جعل P مطلقة
p = pathmodule.Resolve (p) ؛
if (cache && object.prototype.hasownproperty.call (cache ، p)) {
Return Process.NextTick (CB.Bind (null ، null ، cache [p])) ؛
}
var Original = p ،
seelinks = {} ،
المعروف = {} ؛
// موقف الحرف الحالي في P
var pos ؛
// المسار الجزئي حتى الآن ، بما في ذلك القطع المدمجة إن وجدت
var الحالي ؛
// المسار الجزئي بدون مائلة زائدة (إلا عند الإشارة إلى جذر)
قاعدة فار.
// المسار الجزئي الممسوحة ضوئيًا في الجولة السابقة ، مع القطع المائلة
var السابق ؛
يبدأ()؛
وظيفة start () {
// تخطي الجذور
var m = splitrootre.exec (p) ؛
pos = m [0]. الطول ؛
الحالي = م [0] ؛
قاعدة = م [0] ؛
السابق = '' ؛
// على Windows ، تحقق من وجود الجذر. في يونيكس ليست هناك حاجة.
if (isWindows &&! المعروفة [قاعدة]) {
fs.lstat (قاعدة ، وظيفة (خطأ) {
إذا (خطأ) إرجاع CB (err) ؛
المعروف [قاعدة] = صواب ؛
حلقة()؛
}) ؛
} آخر {
Process.NextTick (loop) ؛
}
}
5
// قيم
وظيفة حلقة () {
// توقف إذا تم مسحه ضوئيًا في نهاية المسار
if (pos> = p.length) {
إذا (ذاكرة التخزين المؤقت) ذاكرة التخزين المؤقت [الأصلي] = p ؛
إرجاع CB (null ، p) ؛
}
// ابحث عن الجزء التالي
nextPartre.lastIndex = pos ؛
var result = nextPartre.exec (p) ؛
السابق = الحالي ؛
الحالي += النتيجة [0] ؛
قاعدة = سابقة + نتيجة [1] ؛
pos = nextpartre.lastindex ؛
// تابع إن لم يكن symlink
if (المعروف [base] || (ذاكرة التخزين المؤقت && cache [base] === base)) {
عملية الإرجاع. nexttick (loop) ؛
}
if (cache && object.prototype.hasownproperty.call (ذاكرة التخزين المؤقت ، قاعدة)) {
// رابط رمزي معروف. لا حاجة للإحصاء مرة أخرى.
إرجاع gotResolvedLink (ذاكرة التخزين المؤقت [قاعدة]) ؛
}
إرجاع fs.lstat (قاعدة ، gotstat) ؛
}
وظيفة gotStat (err ، stat) {
إذا (خطأ) إرجاع CB (err) ؛
// إذا لم يكن ارتباطًا ، فقم بتخطي جزء المسار التالي
if (! stat.issymboliclink ()) {
المعروف [قاعدة] = صواب ؛
إذا (ذاكرة التخزين المؤقت) ذاكرة التخزين المؤقت [قاعدة] = قاعدة ؛
عملية الإرجاع. nexttick (loop) ؛
}
// stat & اقرأ الرابط إذا لم تقرأ من قبل
// call gottarget بمجرد معروف هدف الرابط
// dev/ino ارجع دائمًا 0 على Windows ، لذا تخطي الشيك.
if (! isWindows) {
var id = stat.dev.toString (32) + ':' + stat.ino.toString (32) ؛
if (seenlinks.hasownproperty (id)) {
إرجاع gottarget (null ، seelinks [id] ، base) ؛
}
}
fs.stat (قاعدة ، وظيفة (خطأ) {
إذا (خطأ) إرجاع CB (err) ؛
fs.readlink (قاعدة ، وظيفة (خطأ ، الهدف) {
if (! isWindows) seelinks [id] = target ؛
gottarget (خطأ ، الهدف) ؛
}) ؛
}) ؛
}
وظيفة gottarget (err ، الهدف ، قاعدة) {
إذا (خطأ) إرجاع CB (err) ؛
var resolvedLink = pathModule.Resolve (السابق ، الهدف) ؛
إذا (ذاكرة التخزين المؤقت) ذاكرة التخزين المؤقت [base] = resolvedLink ؛
gotResolvedLink (ResolvedLink) ؛
}
وظيفة gotResolvedLink (ResolvedLink) {
// حل الرابط ، ثم ابدأ من جديد
p = pathmodule.resolve (resolvedLink ، p.slice (pos)) ؛
يبدأ()؛
}
} ؛