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 相关文章推荐
Javascript模板技术
Apr 27 Javascript
jquery 图片截取工具jquery.imagecropper.js
Apr 09 Javascript
setTimeout和setInterval的深入理解
Nov 08 Javascript
jQuery学习笔记之toArray()
Jun 09 Javascript
详解JavaScript的变量和数据类型
Nov 27 Javascript
JS中的hasOwnProperty()和isPrototypeOf()属性实例详解
Aug 11 Javascript
浅谈jquery中使用canvas的问题
Oct 10 Javascript
JS文件上传神器bootstrap fileinput详解
Jan 28 Javascript
JS+CSS实现下拉刷新/上拉加载插件
Mar 31 Javascript
Kindeditor单独调用单图上传增加预览功能的实例
Jul 31 Javascript
vue 获取url里参数的两种方法小结
Nov 12 Javascript
详解JS WebSocket断开原因和心跳机制
May 07 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
德劲1104的电路分析与改良
2021/03/01 无线电
TMDPHP 模板引擎使用教程
2012/03/13 PHP
php使用MySQL保存session会话的方法
2015/06/18 PHP
PHP数组函数array_multisort()用法实例分析
2016/04/02 PHP
PHP实现动态创建XML文档的方法
2018/03/30 PHP
JQuery Ajax 跨域访问的解决方案
2010/03/12 Javascript
兼容IE与firefox火狐的回车事件(js与jquery)
2010/10/20 Javascript
扩展JS Date对象时间格式化功能的小例子
2013/12/02 Javascript
快速解决FusionCharts联动的中文乱码问题
2013/12/04 Javascript
利用js(jquery)操作Cookie的方法说明
2013/12/19 Javascript
jquery操作cookie插件分享
2014/01/14 Javascript
js操作iframe父子窗体示例
2014/05/22 Javascript
javascipt:filter过滤介绍及使用
2014/09/10 Javascript
jQuery实现数秒后自动提交form的方法
2015/03/05 Javascript
ExtJS 4.2 Grid组件单元格合并的方法
2016/10/12 Javascript
简单谈谈JS数组中的indexOf方法
2016/10/13 Javascript
js 动态生成json对象、时时更新json对象的方法
2016/12/02 Javascript
10个在JavaScript开发中常遇到的BUG
2017/12/18 Javascript
Vue源码探究之状态初始化
2018/11/14 Javascript
flexible.js实现移动端rem适配方案
2020/04/07 Javascript
[57:41]Secret vs Serenity 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
Python3实现发送QQ邮件功能(附件)
2020/12/23 Python
浅谈numpy数组中冒号和负号的含义
2018/04/18 Python
Python实现的KMeans聚类算法实例分析
2018/12/29 Python
python使用Plotly绘图工具绘制水平条形图
2020/03/25 Python
python flask框架实现重定向功能示例
2019/07/02 Python
pygame库实现俄罗斯方块小游戏
2019/10/29 Python
TensorFlow tf.nn.conv2d实现卷积的方式
2020/01/03 Python
Python常用数据分析模块原理解析
2020/07/20 Python
办理居住证介绍信
2014/01/15 职场文书
合作经营协议书范本
2014/09/16 职场文书
卫校毕业生自我鉴定
2014/09/28 职场文书
CocosCreator如何实现划过的位置显示纹理
2021/04/14 Javascript
详解Python中的进程和线程
2021/06/23 Python
深入浅出讲解Java8函数式编程
2022/01/18 Java/Android
SpringBoot集成MongoDB实现文件上传的步骤
2022/04/18 MongoDB