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 相关文章推荐
效率高的Javscript字符串替换函数的benchmark
Aug 02 Javascript
jQuery旋转插件—rotate支持(ie/Firefox/SafariOpera/Chrome)
Jan 16 Javascript
从js向Action传中文参数出现乱码问题的解决方法
Dec 29 Javascript
jQuery实现的指纹扫描效果实例(附演示与demo源码下载)
Jan 26 Javascript
不间断循环滚动效果的实例代码(必看篇)
Oct 08 Javascript
JS常用算法实现代码
Nov 14 Javascript
@ResponseBody 和 @RequestBody 注解的区别
Mar 08 Javascript
vue.js使用v-pre与v-html输出HTML操作示例
Jul 07 Javascript
js作用域和作用域链及预解析
Apr 11 Javascript
基于JavaScript 实现拖放功能
Sep 12 Javascript
浅谈layui 绑定form submit提交表单的注意事项
Oct 25 Javascript
Vue如何实现验证码输入交互
Dec 07 Vue.js
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
PHP脚本的10个技巧(8)
2006/10/09 PHP
php self,$this,const,static,->的使用
2009/10/22 PHP
easyui的tabs update正确用法分享
2014/03/21 PHP
laravel安装zend opcache加速器教程
2015/03/02 PHP
PHP实现找出链表中环的入口节点
2018/01/16 PHP
PHP与SQL语句写一句话木马总结
2019/10/11 PHP
jquery插件之easing 动态菜单
2010/08/21 Javascript
JS替换字符串中空格方法
2015/04/17 Javascript
HTML5之WebSocket入门3 -通信模型socket.io
2015/08/21 Javascript
jQuery+css实现的换页标签栏效果
2016/01/27 Javascript
JavaScript实现自动切换图片代码
2016/10/11 Javascript
AngularJS指令中的绑定策略实例分析
2016/12/14 Javascript
bootstrap配合Masonry插件实现瀑布式布局
2017/01/18 Javascript
JavaScript 隐性类型转换步骤浅析
2018/03/15 Javascript
详解js删除数组中的指定元素
2018/10/31 Javascript
Vue+Node服务器查询Mongo数据库及页面数据传递操作实例分析
2019/12/20 Javascript
JS实现联想、自动补齐国家或地区名称的功能
2020/07/07 Javascript
python生成指定尺寸缩略图的示例
2014/05/07 Python
python动态网页批量爬取
2016/02/14 Python
PyQt5每天必学之创建窗口居中效果
2018/04/19 Python
Python3.7 dataclass使用指南小结
2019/02/22 Python
Python第三方库face_recognition在windows上的安装过程
2019/05/03 Python
Python3简单实现串口通信的方法
2019/06/12 Python
python如何给字典的键对应的值为字典项的字典赋值
2019/07/05 Python
Python 用matplotlib画以时间日期为x轴的图像
2019/08/06 Python
详解解决Python memory error的问题(四种解决方案)
2019/08/08 Python
对pytorch中的梯度更新方法详解
2019/08/20 Python
Python实现列表中非负数保留,负数转化为指定的数值方式
2020/06/04 Python
Keras 实现加载预训练模型并冻结网络的层
2020/06/15 Python
python脚本和网页有何区别
2020/07/02 Python
使用HTML5进行SVG矢量图形绘制的入门教程
2016/02/19 HTML / CSS
香港百佳网上超级市场:PARKNSHOP.com
2020/06/10 全球购物
2014年大学庆元旦迎新年活动方案
2014/03/09 职场文书
2014政府领导班子对照检查材料思想汇报(3篇)
2014/09/26 职场文书
财务统计员岗位职责
2015/04/14 职场文书
赢在执行观后感
2015/06/16 职场文书