คำอธิบายวิธี:
FS.RealPath เวอร์ชันซิงโครนัส ()
ไวยากรณ์:
การคัดลอกรหัสมีดังนี้:
fs.realpathsync (เส้นทาง, [cache])
เนื่องจากวิธีนี้เป็นของโมดูล FS จึงจำเป็นต้องแนะนำโมดูล FS ก่อนการใช้งาน (var fs = require ("FS"))
รับพารามิเตอร์:
เส้นทาง
แคชเป็นทางเลือกเส้นทางที่แมปตัวอักษรสามารถใช้เพื่อบังคับเส้นทางที่เฉพาะเจาะจงเพื่อแก้ไขหรือหลีกเลี่ยง fs.stat เพิ่มเติมจำเป็นต้องรู้วัตถุเส้นทางจริง
ตัวอย่าง:
การคัดลอกรหัสมีดังนี้:
var fs = ต้องการ ('fs');
// dot ระบุเส้นทางของไฟล์ปัจจุบัน
var str = fs.realpathsync ('.');
console.log (str);
ซอร์สโค้ด:
การคัดลอกรหัสมีดังนี้:
fs.realpathsync = function realpathsync (p, cache) {
// Make P เป็นสัมบูรณ์
p = pathmodule.resolve (p);
if (cache && object.prototype.hasownproperty.call (cache, p)) {
ส่งคืนแคช [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.lstatsync (ฐาน);
รู้จักกันดี [ฐาน] = จริง;
-
-
// เดินไปตามเส้นทางแลกเปลี่ยน pathparts ที่เชื่อมโยงสำหรับจริง
// ค่า
// NB: การเปลี่ยนแปลง P.Length
ในขณะที่ (pos <p.length) {
// ค้นหาส่วนถัดไป
nextPartre.lastindex = pos;
var result = nextpartre.exec (p);
ก่อนหน้า = ปัจจุบัน;
ปัจจุบัน += ผลลัพธ์ [0];
ฐาน = ก่อนหน้า + ผลลัพธ์ [1];
pos = nextpartre.lastindex;
// ดำเนินการต่อถ้าไม่ใช่ symlink
if (รู้จัก [ฐาน] || (แคช && แคช [ฐาน] === ฐาน)) {
ดำเนินการต่อ;
-
var resolvedlink;
if (cache && object.prototype.hasownproperty.call (แคช, ฐาน)) {
// ลิงค์สัญลักษณ์ที่รู้จักกันดี ไม่จำเป็นต้องสถิติอีกครั้ง
ResolvedLink = แคช [ฐาน];
} อื่น {
var stat = fs.lstatsync (ฐาน);
if (! stat.issymbolicLink ()) {
รู้จักกันดี [ฐาน] = จริง;
ถ้า (แคช) แคช [ฐาน] = ฐาน;
ดำเนินการต่อ;
-
// อ่านลิงค์หากไม่ได้อ่านมาก่อน
// dev/ino กลับมา 0 บน windows เสมอดังนั้นข้ามเช็ค
var linkTarget = null;
ถ้า (! iswindows) {
var id = stat.dev.toString (32) + ':' + stat.ino.toString (32);
if (seenlinks.hasownproperty (id)) {
linkTarget = seenlinks [id];
-
-
if (util.isnull (linktarget)) {
fs.statsync (ฐาน);
linkTarget = fs.readlinksync (ฐาน);
-
RELVEDLINK = PATHMODULE.RESOLVE (ก่อนหน้า, LINKTARGET);
// ติดตามสิ่งนี้หากได้รับแคช
ถ้า (แคช) แคช [ฐาน] = ResolvedLink;
if (! iswindows) seelinks [id] = linktarget;
-
// แก้ไขลิงก์จากนั้นเริ่มต้นใหม่
P = PathModule.resolve (ResolvedLink, P.Slice (POS));
เริ่ม();
-
ถ้า (แคช) แคช [ต้นฉบับ] = p;
กลับ P;
-