คำอธิบายวิธี:
รับเส้นทางที่แท้จริง
เส้นทางสัมพัทธ์สามารถแก้ไขได้โดยใช้ process.cwd
ไวยากรณ์:
การคัดลอกรหัสมีดังนี้:
fs.realpath (เส้นทาง, [cache], [การโทรกลับ (err, resolvedpath)])
เนื่องจากวิธีนี้เป็นของโมดูล FS จึงจำเป็นต้องแนะนำโมดูล FS ก่อนการใช้งาน (var fs = require ("FS"))
รับพารามิเตอร์:
เส้นทาง
แคชเป็นทางเลือกเส้นทางที่แมปตัวอักษรสามารถใช้เพื่อบังคับเส้นทางที่เฉพาะเจาะจงเพื่อแก้ไขหรือหลีกเลี่ยง fs.stat เพิ่มเติมจำเป็นต้องรู้วัตถุเส้นทางจริง
โทรกลับ
ข้อยกเว้นผิดพลาด
ที่อยู่ ResolvedPath จริง
ตัวอย่าง:
การคัดลอกรหัสมีดังนี้:
var cache = {'/etc': '/private/etc'};
fs.realpath ('/etc/passwd', แคช, ฟังก์ชั่น (err, resolvedpath) {
ถ้า (err) โยน err;
console.log (ResolvedPath);
-
ซอร์สโค้ด:
การคัดลอกรหัสมีดังนี้:
fs.realpath = function realpath (p, cache, cb) {
if (! util.isfunction (cb)) {
cb = maybecallback (แคช);
แคช = null;
-
// Make P เป็นสัมบูรณ์
p = pathmodule.resolve (p);
if (cache && object.prototype.hasownproperty.call (cache, p)) {
กระบวนการส่งคืน nexttick (cb.bind (null, null, แคช [p]));
-
var Original = P,
seelinks = {}
รู้จัก hard = {};
// ตำแหน่งอักขระปัจจุบันใน P
var pos;
// เส้นทางบางส่วนจนถึงตอนนี้รวมถึงการสแลชต่อท้ายถ้ามี
VAR ปัจจุบัน;
// เส้นทางบางส่วนโดยไม่มีการสแลชต่อท้าย (ยกเว้นเมื่อชี้ไปที่รูท)
ฐาน var;
// เส้นทางบางส่วนที่สแกนในรอบก่อนหน้าด้วย Slash
var ก่อนหน้า;
เริ่ม();
ฟังก์ชั่นเริ่มต้น () {
// ข้ามราก
var m = splitrootre.exec (p);
pos = m [0] .length;
current = m [0];
base = m [0];
ก่อนหน้า = '';
// บน windows ตรวจสอบว่ารูทมีอยู่ บน Unix ไม่จำเป็น
if (iswindows &&! ที่รู้จักกันดี [ฐาน]) {
fs.lstat (ฐาน, ฟังก์ชัน (err) {
ถ้า (err) ส่งคืน cb (err);
รู้จักกันดี [ฐาน] = จริง;
ลูป ();
-
} อื่น {
process.nexttick (ลูป);
-
-
// เดินไปตามเส้นทางแลกเปลี่ยน pathparts ที่เชื่อมโยงสำหรับจริง
// ค่า
ฟังก์ชันลูป () {
// หยุดถ้าสแกนผ่านเส้นทางที่ผ่านมา
if (pos> = p.length) {
ถ้า (แคช) แคช [ต้นฉบับ] = p;
ส่งคืน CB (NULL, P);
-
// ค้นหาส่วนถัดไป
nextPartre.lastindex = pos;
var result = nextpartre.exec (p);
ก่อนหน้า = ปัจจุบัน;
ปัจจุบัน += ผลลัพธ์ [0];
ฐาน = ก่อนหน้า + ผลลัพธ์ [1];
pos = nextpartre.lastindex;
// ดำเนินการต่อถ้าไม่ใช่ symlink
if (รู้จัก [ฐาน] || (แคช && แคช [ฐาน] === ฐาน)) {
กระบวนการส่งคืน NEXTTICK (ลูป);
-
if (cache && object.prototype.hasownproperty.call (แคช, ฐาน)) {
// ลิงค์สัญลักษณ์ที่รู้จัก ไม่จำเป็นต้องสถิติอีกครั้ง
กลับ gotResolvedLink (แคช [ฐาน]);
-
ส่งคืน fs.lstat (ฐาน, gotstat);
-
ฟังก์ชั่น gotstat (err, stat) {
ถ้า (err) ส่งคืน cb (err);
// ถ้าไม่ใช่ symlink ให้ข้ามไปยังส่วนเส้นทางถัดไป
if (! stat.issymbolicLink ()) {
รู้จักกันดี [ฐาน] = จริง;
ถ้า (แคช) แคช [ฐาน] = ฐาน;
กระบวนการส่งคืน NEXTTICK (ลูป);
-
// stat & อ่านลิงค์หากไม่ได้อ่านมาก่อน
// โทร Gottarget ทันทีที่รู้จักเป้าหมายลิงก์
// dev/ino กลับมา 0 บน windows เสมอดังนั้นข้ามเช็ค
ถ้า (! iswindows) {
var id = stat.dev.toString (32) + ':' + stat.ino.toString (32);
if (seenlinks.hasownproperty (id)) {
กลับ Gottarget (Null, Seelinks [ID], ฐาน);
-
-
fs.stat (ฐาน, ฟังก์ชัน (err) {
ถ้า (err) ส่งคืน cb (err);
fs.readlink (ฐาน, ฟังก์ชัน (err, target) {
if (! iswindows) seelinks [id] = เป้าหมาย;
Gottarget (Err, Target);
-
-
-
ฟังก์ชั่น Gottarget (err, target, base) {
ถ้า (err) ส่งคืน cb (err);
var resolvedLink = pathModule.resolve (ก่อนหน้า, เป้าหมาย);
ถ้า (แคช) แคช [ฐาน] = ResolvedLink;
GotResolvedLink (ResolvedLink);
-
ฟังก์ชั่น gotResolvedLink (ResolvedLink) {
// แก้ไขลิงก์จากนั้นเริ่มต้นใหม่
P = PathModule.resolve (ResolvedLink, P.Slice (POS));
เริ่ม();
-
-