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


Posted in Javascript onDecember 16, 2014

方法说明:

获取真实路径。

可以使用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();

  }

};
Javascript 相关文章推荐
js加解密 脚本解密
Feb 22 Javascript
Javascript 实用小技巧
Apr 07 Javascript
jquery删除指定的html标签并保留标签内文本内容的方法
Apr 02 Javascript
jQuery遍历json中多个map的方法
Feb 12 Javascript
js使用DOM操作实现简单留言板的方法
Apr 10 Javascript
js控制div弹出层实现方法
May 11 Javascript
jQuery操作Table技巧大汇总
Jan 23 Javascript
微信小程序之拖拽排序(代码分享)
Jan 21 Javascript
JavaScript实现简单的树形菜单效果
Jun 23 Javascript
angularjs实现的购物金额计算工具示例
May 08 Javascript
Angular-UI Bootstrap组件实现警报功能
Jul 16 Javascript
浅谈VUE中演示v-for为什么要加key
Jan 16 Javascript
node.js中的fs.renameSync方法使用说明
Dec 16 #Javascript
node.js中的fs.rename方法使用说明
Dec 16 #Javascript
关于Javascript加载执行优化的研究报告
Dec 16 #Javascript
jQuery 重复加载错误以及修复方法
Dec 16 #Javascript
node.js中的fs.lstatSync方法使用说明
Dec 16 #Javascript
node.js中的fs.lstat方法使用说明
Dec 16 #Javascript
用js代码和插件实现wordpress雪花飘落效果的四种方法
Dec 15 #Javascript
You might like
ftp类(myftp.php)
2006/10/09 PHP
js中方法重载如何实现?以及函数的参数问题
2013/08/01 Javascript
js下将阿拉伯数字每三位一逗号分隔(如:15000000转化为15,000,000)
2014/06/02 Javascript
JavaScript使用位运算符判断奇数和偶数的方法
2015/06/01 Javascript
JavaScript实现单击下拉框选择直接跳转页面的方法
2015/07/02 Javascript
简单的JS时钟实例讲解
2016/01/13 Javascript
JS for...in 遍历语句用法实例分析
2016/08/24 Javascript
Angular中使用ui router实现系统权限控制及开发遇到问题
2016/09/23 Javascript
jquery组件WebUploader文件上传用法详解
2020/10/23 Javascript
解决Angular.Js与Django标签冲突的方案
2016/12/20 Javascript
js实现简单的获取验证码按钮效果
2017/03/03 Javascript
详解jquery插件jquery.viewport.js学习使用方法
2017/09/08 jQuery
详解使用vuex进行菜单管理
2017/12/21 Javascript
详解Angular6.0使用路由步骤(共7步)
2018/06/29 Javascript
微信小程序解除10个请求并发限制
2018/12/18 Javascript
基于vue实现一个禅道主页拖拽效果
2019/05/27 Javascript
vue组件传值的实现方式小结【三种方式】
2020/02/05 Javascript
动态实现element ui的el-table某列数据不同样式的示例
2021/01/22 Javascript
[45:16]完美世界DOTA2联赛循环赛 IO vs FTD BO2第二场 11.05
2020/11/06 DOTA
python paramiko模块学习分享
2017/08/23 Python
浅谈Python中的作用域规则和闭包
2018/03/20 Python
详解Python装饰器
2019/03/25 Python
Python利用FFT进行简单滤波的实现
2020/02/26 Python
使用Python将语音转换为文本的方法
2020/08/10 Python
一文带你掌握Pyecharts地理数据可视化的方法
2021/02/06 Python
iPhoneX安全区域(Safe Area)底部小黑条在微信小程序和H5的屏幕适配
2020/04/08 HTML / CSS
高中生的学习总结自我鉴定
2013/10/26 职场文书
完美主义个人的自我评价
2014/02/17 职场文书
秋天的图画教学反思
2014/05/01 职场文书
党员学习中共十八大思想报告
2014/09/12 职场文书
检讨书格式范文
2015/05/07 职场文书
2015暑期工社会实践报告
2015/07/13 职场文书
如何做好员工培训计划?
2019/07/09 职场文书
MySQL中你可能忽略的COLLATION实例详解
2021/05/12 MySQL
详解SQL的窗口函数
2022/04/21 Oracle
Python安装及建立虚拟环境的完整步骤
2022/06/25 Servers