방법 설명 :
진짜 길을 얻으십시오.
상대 경로는 Process.cwd를 사용하여 해결할 수 있습니다.
문법:
코드 사본은 다음과 같습니다.
fs.RealPath (Path, [Cache], [Callback (err, ResolvedPath)])))
이 방법은 FS 모듈에 속하므로 사용하기 전에 FS 모듈을 소개해야합니다 (var fs = require ( "fs")).
매개 변수 수신 :
경로 경로
캐시 선택적으로, 문자 그대로 맵핑 된 경로는 특정 경로를 강제로 사용하여 추가 fs.STAT가 실제 경로 객체를 알아야합니다.
콜백 콜백
오류 예외
해결 된 실제 주소
예:
코드 사본은 다음과 같습니다.
var cache = { '/etc': '/private/etc'};
fs.realpath ( '/etc/passwd', 캐시, 함수 (err, resolvedpath) {
(err)를 던지면;
Console.log (ResolvedPath);
});
소스 코드 :
코드 사본은 다음과 같습니다.
fs.realpath = function realPath (p, cache, cb) {
if (! util.isfunction (cb)) {
CB = Maybecallback (캐시);
캐시 = null;
}
// 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 current;
// 후행 슬래시가없는 부분 경로 (루트를 가리키는 경우 제외)
var베이스;
// 이전 라운드에서 스캔 한 부분 경로는 슬래시로
var 이전;
시작();
함수 start () {
// 뿌리를 건너 뜁니다
var m = splitrootre.exec (p);
pos = m [0] .length;
전류 = m [0];
base = m [0];
이전 = '';
// Windows에서 루트가 존재하는지 확인하십시오. 유닉스에는 필요하지 않습니다.
if (iswindows &&! 알려진 하드 [base]) {
fs.lstat (base, function (err) {
if (err) cb (err)를 반환합니다.
알려진 하드 [base] = true;
고리();
});
} 또 다른 {
process.nexttick (루프);
}
}
// 길을 따라 걸어 가면서 링크 된 PathParts를 실제로 바꾸어
// 값
함수 루프 () {
// 경로의 끝 끝을 스캔 한 경우 중지하십시오
if (pos> = p.length) {
if (캐시) 캐시 [Original] = P;
반환 cb (null, p);
}
// 다음 부분을 찾으십시오
NextPartre.lastIndex = pos;
var result = nextpartre.exec (p);
이전 = 현재;
current += 결과 [0];
base = 이전 + 결과 [1];
pos = nextpartre.lastindex;
// Symlink가 아닌 경우 계속하십시오
if (알려진 Hard [base] || (캐시 && 캐시 [base] === base)) {
Return Process.NextTick (루프);
}
if (cache && object.prototype.hasownproperty.call (cache, base)) {
// 알려진 상징적 링크. 다시 통계 할 필요가 없습니다.
return gotresolvedlink (캐시 [base]);
}
return fs.lstat (base, gotstat);
}
함수 gotstat (err, stat) {
if (err) cb (err)를 반환합니다.
// Symlink가 아닌 경우 다음 경로 부분으로 건너 뜁니다.
if (! stat.issymboliclink ()) {
알려진 하드 [base] = true;
if (캐시) 캐시 [base] = base;
Return Process.NextTick (루프);
}
// 이전에 읽지 않은 경우 통계 및 링크 읽기
// 링크 대상이 알려진 즉시 gotTarget에게 전화하십시오.
// dev/ino는 항상 Windows에서 0을 반환하므로 수표를 건너 뜁니다.
if (! iswindows) {
var id = stat.dev.tostring (32) + ':' + stat.ino.tostring (32);
if (seenlinks.hasownProperty (id)) {
return gottarget (null, seelinks [id], base);
}
}
fs.stat (base, function (err) {
if (err) cb (err)를 반환합니다.
fs.ReadLink (base, function (err, target) {
if (! iswindows) seelinks [id] = target;
gottarget (err, target);
});
});
}
기능 gottarget (err, target, base) {
if (err) cb (err)를 반환합니다.
var resolvedLink = pathModule.Resolve (이전, 대상);
if (캐시) 캐시 [base] = resolvedLink;
gotResolvedLink (ResolvedLink);
}
함수 gotResolvedLink (resolvedLink) {
// 링크를 해결 한 다음 다시 시작하십시오
p = pathModule.Resolve (ResolvedLink, P.Slice (POS));
시작();
}
};