node.js中的fs.realpathSync方法使用说明

  方法说明:

  同步版的 fs.realpath()

  语法:

  

复制代码 代码如下:

  fs.realpathSync(path, [cache])

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

  接收参数:

  path                             路径

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

  例子:

  

复制代码 代码如下:

  var fs = require('fs');

  // 点号表示当前文件所在路径

  var str = fs.realpathSync('.');

  console.log(str);

  源码:

  

复制代码 代码如下:

  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;

  };