メソッドの説明:
実際のパスを取得します。
相対パスは process.cwd を使用して解決できます。
文法:
fs.realpath(path, [キャッシュ], [callback(err,solvedPath)])
このメソッドは fs モジュールに属しているため、使用する前に fs モジュールを導入する必要があります (var fs= require(“fs”) )
パラメータを受信します:
パス パス
キャッシュ‐ ‐ ‐ ‐ ‐ ‐ オプションで、リテラルのマップされたパスを使用して、特定のパスを強制的に解決したり、実際のパス オブジェクトを知るための追加の fs.stat の必要性を回避したりできます。
コールバック
エラー例外
resolvedPath 実際のアドレス
例:
var キャッシュ = {'/etc':'/private/etc'};
fs.realpath('/etc/passwd', キャッシュ, 関数 (err,solvedPath) {
if (err) throw err;
console.log(resolvedPath);
});
ソースコード:
コードをコピー コードは次のとおりです:
fs.realpath = 関数 realpath(p, キャッシュ, cb) {
if (!util.isFunction(cb)) {
cb = mightCallback(cache);
キャッシュ = null;
}
// p を絶対値にする
p = pathModule.resolve(p);
if (キャッシュ && Object.prototype.hasOwnProperty.call(cache, p)) {
return process.nextTick(cb.bind(null, null, cache[p]));
}
var オリジナル = p,
見られたリンク = {},
既知ハード = {};
// p
内の現在の文字位置
var pos;
// これまでの部分パス(末尾のスラッシュがあればそれも含む)
var current;
// 末尾のスラッシュのない部分パス (ルートを指す場合を除く)
var ベース;
// 前のラウンドでスキャンされた部分パス、スラッシュ
var 前;
start();
関数 start() {
// ルートをスキップ
var m = splitRootRe.exec(p);
pos = m[0].length;
現在 = m[0];
ベース = m[0];
前 = '';
// Windows では、ルートが存在することを確認します。 UNIX では必要ありません。
if (isWindows && !knownHard[base]) {
fs.lstat(base, function(err) {
if (err) return cb(err);
knownHard[base] = true;
LOOP();
});
} else {
process.nextTick(LOOP);
}
}
// パスをたどって、リンクされたパスパーツを実際のパスパーツと交換します
// 値
関数 LOOP() {
// パスの終端を超えてスキャンされた場合は停止します
if (pos >= p.length) {
if (キャッシュ) キャッシュ[オリジナル] = p;
return cb(null, p);
}
// 次の部分を見つけます
nextPartRe.lastIndex = pos;
var result = nextPartRe.exec(p);
前 = 現在;
現在 = 結果[0];
ベース = 前の結果[1];
pos = nextPartRe.lastIndex;
// シンボリックリンクでない場合は続行
if (knownHard[base] || (キャッシュ && キャッシュ[ベース] === ベース)) {
return process.nextTick(LOOP);
}
if (キャッシュ && Object.prototype.hasOwnProperty.call(キャッシュ, ベース)) {
// 既知のシンボリック リンク。再度統計を行う必要はありません。
return gotResolvedLink(cache[base]);
}
return fs.lstat(base, gotStat);
}
関数 gotStat(err, stat) {
if (err) return cb(err);
// シンボリックリンクでない場合は、次のパス部分にスキップします
if (!stat.isSymbolicLink()) {
knownHard[base] = true;
if (キャッシュ) キャッシュ[ベース] = ベース;
return process.nextTick(LOOP);
}
// 統計を取得し、前に読んでいない場合はリンクを読み取ります
// リンクターゲットが判明したらすぐに gotTarget を呼び出します
// Windows では dev/ino は常に 0 を返すため、チェックをスキップします。
if (!isWindows) {
var id = stat.dev.toString(32) ':' stat.ino.toString(32);
if (seenLinks.hasOwnProperty(id)) {
return gotTarget(null, seenLinks[id], Base);
}
}
fs.stat(base, function(err) {
if (err) return cb(err);
fs.readlink(base, function(err, target) {
if (!isWindows) seenLinks[id] = target;
gotTarget(err, ターゲット);
});
});
}
関数 gotTarget(err, ターゲット, ベース) {
if (err) return cb(err);
varsolvedLink = pathModule.resolve(previous, target);
if (キャッシュ) キャッシュ[ベース] =solvedLink;
gotResolvedLink(resolvedLink);
}
function gotResolvedLink(resolvedLink) {
// リンクを解決してからやり直します
p = pathModule.resolve(resolvedLink, p.slice(pos));
start();
}
};