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

方法说明:

获取真实路径。

可以使用process.cwd解决相对路径。

语法:

代码如下:

fs.realpath(path, [cache], [callback(err , resolvedPath)])

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

接收参数:

path                             路径

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

callback                       回调

err                                异常

resolvedPath               真实地址

例子:

代码如下:

var cache = {'/etc':'/private/etc'};
fs.realpath('/etc/passwd', cache, function (err, resolvedPath) {
  if (err) throw err;
  console.log(resolvedPath);
});

源码:

代码如下:

fs.realpath = function realpath(p, cache, cb) {
  if (!util.isFunction(cb)) {
    cb = maybeCallback(cache);
    cache = null;
  }
  // make p is absolute
  p = pathModule.resolve(p);
  if (cache && Object.prototype.hasOwnProperty.call(cache, p)) {
    return process.nextTick(cb.bind(null, null, 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.lstat(base, function(err) {
        if (err) return cb(err);
        knownHard[base] = true;
        LOOP();
      });
    } else {
      process.nextTick(LOOP);
    }
  }
  // walk down the path, swapping out linked pathparts for their real
  // values
  function LOOP() {
    // stop if scanned past end of path
    if (pos >= p.length) {
      if (cache) cache[original] = p;
      return cb(null, p);
    }
    // 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)) {
      return process.nextTick(LOOP);
    }
    if (cache && Object.prototype.hasOwnProperty.call(cache, base)) {
      // known symbolic link. no need to stat again.
      return gotResolvedLink(cache[base]);
    }
    return fs.lstat(base, gotStat);
  }
  function gotStat(err, stat) {
    if (err) return cb(err);
    // if not a symlink, skip to the next path part
    if (!stat.isSymbolicLink()) {
      knownHard[base] = true;
      if (cache) cache[base] = base;
      return process.nextTick(LOOP);
    }
    // stat & read the link if not read before
    // call gotTarget as soon as the link target is known
    // dev/ino always return 0 on windows, so skip the check.
    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, target);
      });
    });
  }
  function gotTarget(err, target, base) {
    if (err) return cb(err);
    var resolvedLink = pathModule.resolve(previous, target);
    if (cache) cache[base] = resolvedLink;
    gotResolvedLink(resolvedLink);
  }
  function gotResolvedLink(resolvedLink) {
    // resolve the link, then start over
    p = pathModule.resolve(resolvedLink, p.slice(pos));
    start();
  }
};

(0)

相关推荐

  • node.js中的path.resolve方法使用说明

    方法说明: 将参数 to 位置的字符解析到一个绝对路径里. 语法: 复制代码 代码如下: path.resolve([from ...], to) 由于该方法属于path模块,使用前需要引入path模块(var path= require("path") ) 接收参数: from                     源路径 to                         将被解析到绝对路径的字符串 例子: 复制代码 代码如下: path.resolve('/foo/bar',

  • node.js中的path.extname方法使用说明

    方法说明: 返回path路径文件扩展名,如果path以 '.' 为结尾,将返回 '.',如果无扩展名 又 不以'.'结尾,将返回空值. 语法: 复制代码 代码如下: path.extname(p) 由于该方法属于path模块,使用前需要引入path模块(var path= require("path") ) 接收参数: p       path路径 例子: 复制代码 代码如下: path.extname('index.html') // returns '.html' path.ext

  • node.js中的path.basename方法使用说明

    方法说明: 提取出用 '/' 隔开的path的最后一部分.(8详见例子) 语法: 复制代码 代码如下: path.basename(p, [ext]) 由于该方法属于path模块,使用前需要引入path模块(var path= require("path") ) 接收参数: p                    要处理的path ext                 要过滤的字符 例子: 复制代码 代码如下: var path= require("path")

  • node.js中的path.isAbsolute方法使用说明

    方法说明: 检测path是否为绝对路径.一个绝对路径会解析到相同的位置,无论是不是在工作目录. 语法: 复制代码 代码如下: path.isAbsolute(path) 由于该方法属于path模块,使用前需要引入path模块(var path= require("path") ) 接收参数: path         path路径 例子: 复制代码 代码如下: //Posix examples: path.isAbsolute('/foo/bar') // true path.isAb

  • NodeJS学习笔记之(Url,QueryString,Path)模块

    一,开篇分析 这篇文章把这三个模块拿来一起说,原因是它们各自的篇幅都不是很长,其次是它们之间存在着依赖关系,所以依次介绍并且实例分析.废话不多说了,请看下面文档: (1),"Url模块" 来个小栗子: 复制代码 代码如下: var url = require('url');  var queryUrl = "http://localhost:8888/bb?name=bigbear&memo=helloworld" ;  console.log(typeof

  • node.js中的path.dirname方法使用说明

    方法说明: 返回path的目录.类似于UNIX目录命令. 语法: 复制代码 代码如下: path.dirname(p) 由于该方法属于path模块,使用前需要引入path模块(var path= require("path") ) 接收参数: p        path地址 例子: 复制代码 代码如下: var path= require("path"); path.dirname('/foo/bar/baz/asdf/quux') // returns '/foo

  • node.js中的path.sep方法使用说明

    方法说明: 将特定文字分隔符 '\\' 或 '/' 的字符串转换成数组对象. 语法: 复制代码 代码如下: path.sep 由于该方法属于path模块,使用前需要引入path模块(var path= require("path") ) 接收参数: 无 例子: 复制代码 代码如下: *nix 系统下的例子: 'foo/bar/baz'.split(path.sep) // returns ['foo', 'bar', 'baz']   windows 系统下的例子 'foo\\bar\

  • Node.js中路径处理模块path详解

    前言 在node.js中,提供了一个path某块,在这个模块中,提供了许多使用的,可被用来处理与转换路径的方法与属性,将path的接口按照用途归类,仔细琢磨琢磨,也就没那么费解了.下面我们就来详细介绍下关于Node.js中的路径处理模块path. 获取路径/文件名/扩展名 获取路径:path.dirname(filepath) 获取文件名:path.basename(filepath) 获取扩展名:path.extname(filepath) 获取所在路径 例子如下: var path = re

  • node.js中的path.join方法使用说明

    方法说明: 将多个参数组合成一个 path (详细请看例子) 语法: 复制代码 代码如下: path.join([path1], [path2], [...]) 由于该方法属于path模块,使用前需要引入path模块(var path= require("path") ) 例子: 复制代码 代码如下: path.join('/foo', 'bar', 'baz/asdf', 'quux', '..') // returns '/foo/bar/baz/asdf' path.join('

  • node.js中的path.normalize方法使用说明

    方法说明: 输出规范格式的path字符串. 语法: 复制代码 代码如下: path.normalize(p) 由于该方法属于path模块,使用前需要引入path模块(var path= require("path") ) 例子: 复制代码 代码如下: path.normalize('/foo/bar//baz/asdf/quux/..') // returns '/foo/bar/baz/asdf' 源码: 复制代码 代码如下: // windows version   exports

随机推荐