Node.js fs.realpathSync 同步解析真实路径详解

作者:后端茶话时间:2026-10-28 17:39:22浏览:316

本文详细介绍 Node.js 中 fs.realpathSync 方法的用法。该函数同步解析路径,返回绝对真实路径,支持通过 cache 参数优化性能。文章包含语法说明、参数解释、使用示例及底层源码逻辑分析,帮助开发者理解路径解析与符号链接处理机制。

fs.realpathSync 方法概述

方法说明:

fs.realpathSync 是 fs.realpath 的同步版本。

语法:

代码如下:

fs.realpathSync(path, [cache])

由于该方法属于 fs 模块,使用前需要引入 fs 模块(var fs= require(“fs”) )

接收参数:

path 路径

cache 可选,一个文字的映射路径可用于强制一个特定的路径解决或避免额外的fs.stat需要知道真正的路径对象。

fs.realpathSync 使用示例

例子:

代码如下:

var fs = require('fs');
 
// 点号表示当前文件所在路径
var str = fs.realpathSync('.');
console.log(str);

fs.realpathSync 源码逻辑解析

源码:

代码如下:

fs.realpathSync = function realpathSync(p, cache) {
// make p is absolute
p = pathModule.resolve(p);
if (cache && Object.prototype.hasOwnProperty.call(cache, p)) {
return cache[p];
  }
var original = p,
seenLinks = {},
knownHard = {};
// current character position in p
var pos;
// the partial path so far, including a trailing slash if any
var current;
// the partial path without a trailing slash (except when pointing at a root)
var base;
// the partial path scanned in the previous round, with slash
var previous;
start();
function start() {
// Skip over roots
var m = splitRootRe.exec(p);
pos = m[0].length;
current = m[0];
base = m[0];
previous = '';
// On windows, check that the root exists. On unix there is no need.
if (isWindows && !knownHard[base]) {
fs.lstatSync(base);
knownHard[base] = true;
    }
  }
// walk down the path, swapping out linked pathparts for their real
// values
// NB: p.length changes.
while (pos < p.length) {
// find the next part
nextPartRe.lastIndex = pos;
var result = nextPartRe.exec(p);
previous = current;
current += result[0];
base = previous + result[1];
pos = nextPartRe.lastIndex;
// continue if not a symlink
if (knownHard[base] || (cache && cache[base] === base)) {
continue;
    }
var resolvedLink;
if (cache && Object.prototype.hasOwnProperty.call(cache, base)) {
// some known symbolic link. no need to stat again.
resolvedLink = cache[base];
} else {
var stat = fs.lstatSync(base);
if (!stat.isSymbolicLink()) {
knownHard[base] = true;
if (cache) cache[base] = base;
continue;
      }
// read the link if it wasn't read before
// dev/ino always return 0 on windows, so skip the check.
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);
      }
resolvedLink = pathModule.resolve(previous, linkTarget);
// track this, if given a cache.
if (cache) cache[base] = resolvedLink;
if (!isWindows) seenLinks[id] = linkTarget;
    }
// resolve the link, then start over
p = pathModule.resolve(resolvedLink, p.slice(pos));
start();
  }
if (cache) cache[original] = p;
return p;
};
作者最新文章