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 相关文章推荐
select标签模拟/美化方法采用JS外挂式插件
Apr 01 Javascript
JavaScript中exec函数用法实例分析
Jun 08 Javascript
Eclipse编辑jsp、js文件时卡死现象的解决办法汇总
Feb 02 Javascript
JS面向对象编程详解
Mar 06 Javascript
jquery submit()不能提交表单的解决方法
Apr 24 jQuery
使用react-router4.0实现重定向和404功能的方法
Aug 28 Javascript
基于AngularJS的简单使用详解
Sep 10 Javascript
JavaScript 自定义事件之我见
Sep 25 Javascript
微信小程序首页的分类功能和搜索功能的实现思路及代码详解
Sep 11 Javascript
js for终止循环 跳出多层循环
Oct 04 Javascript
vue router 源码概览案例分析
Oct 09 Javascript
利用Bootstrap Multiselect实现下拉框多选功能
Apr 08 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
ThinkPHP采用原生query实现关联查询left join实例
2014/12/02 PHP
浅谈php冒泡排序
2014/12/30 PHP
php同时使用session和cookie来保存用户登录信息的实现代码
2016/05/13 PHP
js动态创建、删除表格示例代码
2013/08/07 Javascript
js几秒以后倒计时跳转示例
2013/12/26 Javascript
jquery 选取方法都有哪些
2014/05/18 Javascript
js判断上传文件后缀名是否合法
2016/01/28 Javascript
jquery ajax双击div可直接修改div中的内容
2016/03/04 Javascript
jQuery UI Bootstrap是什么?
2016/06/17 Javascript
微信小程序 wxapp画布 canvas详细介绍
2016/10/31 Javascript
基于Bootstrap框架实现图片切换
2017/03/10 Javascript
js实现水平滚动菜单导航
2017/07/21 Javascript
jstree中的checkbox默认选中和隐藏示例代码
2019/12/29 Javascript
jQuery表单校验插件validator使用方法详解
2020/02/18 jQuery
微信小程序实现时间戳格式转换
2020/07/20 Javascript
vue动态加载SVG文件并修改节点数据的操作代码
2020/08/17 Javascript
Python中的jquery PyQuery库使用小结
2014/05/13 Python
python使用正则表达式提取网页URL的方法
2015/05/26 Python
Python网站验证码识别
2016/01/25 Python
Python中property属性实例解析
2018/02/10 Python
解决python中导入win32com.client出错的问题
2019/07/26 Python
Python django搭建layui提交表单,表格,图标的实例
2019/11/18 Python
pyinstaller打包程序exe踩过的坑
2019/11/19 Python
基于python求两个列表的并集.交集.差集
2020/02/10 Python
python numpy库linspace相同间隔采样的实现
2020/02/25 Python
python中温度单位转换的实例方法
2020/12/27 Python
java字符串格式化输出实例讲解
2021/01/06 Python
python 30行代码实现蚂蚁森林自动偷能量
2021/02/08 Python
CSS3教程(5):网页背景图片
2009/04/02 HTML / CSS
荷兰鞋子在线:Nelson Schoenen
2017/12/25 全球购物
TCP协议通讯的过程和步骤是什么
2015/10/18 面试题
失业者真诚求职信范文
2013/12/25 职场文书
后勤服务中心总经理工作职责
2014/03/03 职场文书
个人求职自荐信范文
2015/03/06 职场文书
医院党建工作总结2015
2015/05/26 职场文书
解决Maven项目中 Invalid bound statement 无效的绑定问题
2021/06/15 Java/Android