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的Eval函数
Jul 26 Javascript
javascript中的缓动效果实现程序
Dec 29 Javascript
jQuery实现自定义checkbox和radio样式
Jul 13 Javascript
AngularJS整合Springmvc、Spring、Mybatis搭建开发环境
Feb 25 Javascript
BootStrap的Datepicker控件使用心得分享
May 25 Javascript
js实现千分符和保留几位小数的简单实例
Aug 01 Javascript
使用jquery如何获取时间
Oct 13 Javascript
vue组件父与子通信详解(一)
Nov 07 Javascript
初探js和简单隐藏效果的实例
Nov 23 Javascript
浅谈Node.js爬虫之网页请求模块
Jan 11 Javascript
JavaScript实现的3D旋转魔方动画效果实例代码
Jul 31 Javascript
基于JavaScript实现年月日三级联动
Jun 22 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的list()的一步操作给一组变量进行赋值的使用
2011/05/18 PHP
php学习笔记 类的声明与对象实例化
2011/06/13 PHP
php实现cc攻击防御和防止快速刷新页面示例
2014/02/13 PHP
如何确保JavaScript的执行顺序 之jQuery.html深度分析
2011/03/03 Javascript
js的.innerHTML = ""IE9下显示有错误的解决方法
2013/09/16 Javascript
关于JavaScript中name的意义冲突示例介绍
2014/05/29 Javascript
深入理解JavaScript系列(45):代码复用模式(避免篇)详解
2015/03/04 Javascript
10个很棒的jQuery代码片段
2015/09/24 Javascript
跟我学习javascript的prototype,getPrototypeOf和__proto__
2015/11/17 Javascript
Node.js中Request模块处理HTTP协议请求的基本使用教程
2016/03/31 Javascript
BootStrap轻松实现微信页面开发代码分享
2016/10/21 Javascript
canvas实现探照灯效果
2017/02/07 Javascript
详解如何在Angular中快速定位DOM元素
2017/05/17 Javascript
JS实现的抛物线运动效果示例
2018/01/30 Javascript
JS中使用new Option()实现时间联动效果
2018/12/10 Javascript
Vue中axios拦截器如何单独配置token
2019/12/27 Javascript
[01:07:11]Secret vs Newbee 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
使用python脚本自动创建pip.ini配置文件代码实例
2019/09/20 Python
pytorch逐元素比较tensor大小实例
2020/01/03 Python
PyInstaller将Python文件打包为exe后如何反编译(破解源码)以及防止反编译
2020/04/15 Python
解决IDEA 的 plugins 搜不到任何的插件问题
2020/05/04 Python
python中sort sorted reverse reversed函数的区别说明
2020/05/11 Python
用python实现学生管理系统
2020/07/24 Python
Python应用自动化部署工具Fabric原理及使用解析
2020/11/30 Python
css3实现顶部社会化分享按钮示例
2014/05/06 HTML / CSS
css3实现椭圆轨迹旋转的示例代码
2018/10/29 HTML / CSS
印尼穆斯林时尚购物网站:Hijabenka
2016/12/10 全球购物
JVM是一个编译程序还是解释程序
2012/09/11 面试题
自动化专业职业生涯规划书范文
2014/01/16 职场文书
代理商会议邀请函
2014/01/27 职场文书
全国优秀辅导员事迹材料
2014/05/14 职场文书
党员个人承诺书
2015/04/27 职场文书
大学生违纪检讨书范文
2015/05/07 职场文书
运动会800米赞词
2015/07/22 职场文书
同学聚会致辞集锦
2015/07/28 职场文书
python数字图像处理实现图像的形变与缩放
2022/06/28 Python