メソッド説明:
本当の道を手に入れましょう。
相対パスは、process.cwdを使用して解決できます。
文法:
コードコピーは次のとおりです。
fs.realpath(path、[cache]、[callback(err、resolvedpath)]))
この方法はFSモジュールに属しているため、使用前にFSモジュールを導入する必要があります(var fs = require( "fs"))
パラメーターを受信:
パスパス
キャッシュオプションでは、文字通りマッピングされたパスを使用して、特定のパスを強制して追加のfstatを解決または回避する必要があります。
コールバックコールバック
ERR例外
ResolvedPath Real Address
例:
コードコピーは次のとおりです。
var cache = {'/etc': '/private/etc'};
fs.realpath( '/etc/passwd'、キャッシュ、function(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)){
return process.nexttick(cb.bind(null、null、cache [p]));
}
var original = p、
seelinks = {}、
既知のハード= {};
// pの現在の文字位置
var pos;
//これまでの部分的なパスは、存在する場合のトレイリングスラッシュを含む
var電流;
//トレーリングスラッシュのない部分的なパス(ルートを指すときを除く)
var Base;
//前のラウンドでスキャンされた部分的なパス、スラッシュで
var previous;
始める();
function start(){
//根をスキップします
var m = splitrootre.exec(p);
pos = m [0] .length;
current = m [0];
base = m [0];
前= '';
// Windowsで、ルートが存在することを確認します。 Unixには必要ありません。
if(iswindows &&!nownhard [base]){
fs.lstat(base、function(err){
if(err)return cb(err);
既知のハード[base] = true;
ループ();
});
} それ以外 {
process.nexttick(loop);
}
}
//パスを歩いて、リンクされたパスパートをリアルに交換します
//値
function loop(){
//パスの過去の端をスキャンした場合は停止します
if(pos> = p.length){
if(cache)cache [original] = p;
CB(null、p)を返します。
}
//次の部分を見つけます
nextpartre.lastindex = pos;
var result = nextpartre.exec(p);
前= current;
current += result [0];
base =前 + result [1];
pos = nextpartre.lastindex;
// Symlinkではない場合は続行します
if(incoundhard [base] ||(cache && cache [base] === base)){
return process.nexttick(loop);
}
if(cache && object.prototype.hasownproperty.call(cache、base)){
//既知のシンボリックリンク。二度と統計する必要はありません。
return gotResolvedLink(cache [base]);
}
return fs.lstat(base、gotstat);
}
関数gotstat(err、stat){
if(err)return cb(err);
// Symlinkではない場合は、次のパスパーツにスキップします
if(!stat.issymboliclink()){
既知のハード[base] = true;
if(cache)cache [base] = base;
return process.nexttick(loop);
}
// stat&以前に読んでいない場合はリンクを読む
//リンクターゲットがわかったらすぐにgottargetに電話してください
// dev/inoは常にWindowsで0を返しますので、チェックをスキップします。
if(!iswindows){
var id = stat.dev.tostring(32) + ':' + stat.ino.tostring(32);
if(shouslinks.hasownproperty(id)){
return gottarget(null、seelinks [id]、base);
}
}
fs.stat(base、function(err){
if(err)return cb(err);
fs.readLink(base、function(err、ターゲット){
if(!iswindows)seelinks [id] =ターゲット;
Gottarget(err、ターゲット);
});
});
}
function gottarget(err、ターゲット、ベース){
if(err)return cb(err);
var ResolvedLink = pathModule.Resolve(前、ターゲット);
if(cache)cache [base] = ResolvedLink;
gotResolvedLink(ResolvedLink);
}
function gotResolvedLink(ResolvedLink){
//リンクを解決してから、やり直します
p = pathModule.Resolve(ResolvedLink、P.Slice(POS));
始める();
}
};