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 保存数组到Cookie的代码
Apr 14 Javascript
div失去焦点事件实现思路
Apr 22 Javascript
实现网页页面跳转的几种方法(meta标签、js实现、php实现)
May 20 Javascript
jquery制作 随机弹跳的小球特效
Feb 01 Javascript
jQuery获取及设置表单input各种类型值的方法小结
May 24 Javascript
vue组件间通信解析
Mar 01 Javascript
手把手搭建安装基于windows的Vue.js运行环境
Jun 12 Javascript
JavaScript生成指定范围的时间列表
Mar 19 Javascript
vue3.0 CLI - 2.1 -  component 组件入门教程
Sep 14 Javascript
Vue中插入HTML代码的方法
Sep 21 Javascript
基于vue实现探探滑动组件功能
May 29 Javascript
微信小程序实现底部弹出模态框
Nov 18 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
PHP下通过系统信号量加锁方式获取递增序列ID
2009/09/25 PHP
分享下页面关键字抓取components.arrow.com站点代码
2014/01/30 PHP
ThinkPHP框架实现session跨域问题的解决方法
2014/07/01 PHP
PHP伪静态Rewrite设置之APACHE篇
2014/07/30 PHP
JS+PHP实现用户输入数字后显示最大的值及所在位置
2017/06/19 PHP
在IE下:float属性会影响offsetTop的取值
2006/12/22 Javascript
Easy.Ajax 部分源代码 支持文件上传功能, 兼容所有主流浏览器
2011/02/24 Javascript
js 控制图片大小核心讲解
2013/10/09 Javascript
JS控制输入框内字符串长度
2014/05/21 Javascript
简介JavaScript中的setHours()方法的使用
2015/06/11 Javascript
实例解析jQuery插件EasyUI最常用的表单验证规则
2015/11/29 Javascript
JavaScript获取对象在页面中位置坐标的方法
2016/02/03 Javascript
从零学习node.js之文件操作(三)
2017/02/21 Javascript
详解在vue-cli项目中使用mockjs(请求数据删除数据)
2017/10/23 Javascript
代码详解JS操作剪贴板
2018/02/11 Javascript
在element-ui的el-tree组件中用render函数生成el-button的实例代码
2018/11/05 Javascript
深入了解响应式React Native Echarts组件
2019/05/29 Javascript
JavaScript实现打砖块游戏
2020/02/25 Javascript
JavaScript enum枚举类型定义及使用方法
2020/05/15 Javascript
Vue切换div显示隐藏,多选,单选代码解析
2020/07/14 Javascript
[01:11:15]VGJ.S vs Secret 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
详解Python中最难理解的点-装饰器
2017/04/03 Python
python实现员工管理系统
2018/01/11 Python
pytorch使用Variable实现线性回归
2019/05/21 Python
bluepy 一款python封装的BLE利器简单介绍
2019/06/25 Python
浅析python redis的连接及相关操作
2019/11/07 Python
详解torch.Tensor的4种乘法
2020/09/03 Python
详解python3 GUI刷屏器(附源码)
2021/02/18 Python
餐饮加盟计划书
2014/01/10 职场文书
厉行勤俭节约倡议书
2014/05/16 职场文书
2014年安全生产目标责任书
2014/07/23 职场文书
大二学生自我检讨书
2014/10/23 职场文书
师德标兵先进事迹材料
2014/12/19 职场文书
小学生一年级(书信作文)
2019/08/13 职场文书
导游词之安徽九华山
2019/09/18 职场文书
mysql中关键词exists的用法实例详解
2022/06/10 MySQL