キャッシュ‐ ‐ ‐ ‐ ‐ ‐ オプションで、リテラルのマップされたパスを使用して、特定のパスを強制的に解決したり、実際のパス オブジェクトを知るための追加の fs.stat の必要性を回避したりできます。
fs.realpathSync = 関数 realpathSync(p, キャッシュ) {
// p を絶対値にする
p = pathModule.resolve(p);
if (キャッシュ && Object.prototype.hasOwnProperty.call(cache, p)) {
キャッシュを返す[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.lstatSync(base);
knownHard[base] = true;
}
}
// パスをたどって、リンクされたパスパーツを実際のパスパーツと交換します
// 値
// 注意: p.length は変更されます。
while (pos
// 次の部分を見つけます
nextPartRe.lastIndex = pos;
var result = nextPartRe.exec(p);
前 = 現在;
現在 = 結果[0];
ベース = 前の結果[1];
pos = nextPartRe.lastIndex;
// シンボリックリンクでない場合は続行
if (knownHard[base] || (キャッシュ && キャッシュ[ベース] === ベース)) {
続行;
}
varresolvedLink;
if (キャッシュ && Object.prototype.hasOwnProperty.call(キャッシュ, ベース)) {
// 既知のシンボリック リンク。再度統計を行う必要はありません。
解決済みリンク = キャッシュ[ベース];
} else {
var stat = fs.lstatSync(base);
if (!stat.isSymbolicLink()) {
knownHard[base] = true;
if (キャッシュ) キャッシュ[ベース] = ベース;
続行;
}
// まだ読まれていない場合はリンクを読みます
// Windows では dev/ino は常に 0 を返すため、チェックをスキップします。
var linkTarget = null;
if (!isWindows) {
var id = stat.dev.toString(32) ':' stat.ino.toString(32);
if (seenLinks.hasOwnProperty(id)) {
linkTarget = seenLinks[id];
}
}
if (util.isNull(linkTarget)) {
fs.statSync(base);
linkTarget = fs.readlinkSync(base);
}
solvedLink = pathModule.resolve(previous, linkTarget);
// キャッシュが与えられている場合、これを追跡します。
if (キャッシュ) キャッシュ[ベース] =solvedLink;
if (!isWindows) seenLinks[id] = linkTarget;
}
// リンクを解決してからやり直します
p = pathModule.resolve(resolvedLink, p.slice(pos));
start();
}
if (キャッシュ) キャッシュ[オリジナル] = p;
p を返します;
};