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开发规范要求(规范化代码)
Aug 16 Javascript
javaScript面向对象继承方法经典实现
Aug 20 Javascript
window.location.href = window.location.href 跳转无反应 a超链接onclick事件写法
Aug 21 Javascript
今天是星期几的4种JS代码写法
Sep 17 Javascript
AngularJS基础学习笔记之指令
May 10 Javascript
Bootstrap轮播插件简单使用方法介绍
Jun 21 Javascript
jQuery和hwSlider实现内容响应式可触控滑动切换效果附源码下载(二)
Jun 22 Javascript
Angular2表单自定义验证器的实现
Oct 19 Javascript
js仿淘宝商品放大预览功能
Mar 15 Javascript
基于elementUI使用v-model实现经纬度输入的vue组件
May 12 Javascript
js实现无缝轮播图效果
Mar 09 Javascript
Vue插槽_特殊特性slot,slot-scope与指令v-slot说明
Sep 04 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
使用sockets:从新闻组中获取文章(一)
2006/10/09 PHP
PHP 网络开发详解之远程文件包含漏洞
2010/04/25 PHP
php图片的二进制转换实现方法
2014/12/15 PHP
Laravel 5框架学习之Laravel入门和新建项目
2015/04/07 PHP
PHP实现多图上传和单图上传功能
2018/05/17 PHP
php用wangeditor3实现图片上传功能
2019/08/22 PHP
PHP For循环字母A-Z当超过26个字母时输出AA,AB,AC
2020/02/16 PHP
用javascript实现的图片马赛克后显示并切换加文字功能
2007/04/21 Javascript
锋利的jQuery 要点归纳(三) jQuery中的事件和动画(下:动画篇)
2010/03/24 Javascript
浅谈javascript的原型继承
2012/07/25 Javascript
浅析ajax请求json数据并用js解析(示例分析)
2013/07/13 Javascript
javascript中处理时间戳为日期格式的方法
2014/01/02 Javascript
谷歌地图打不开的解决办法
2014/08/07 Javascript
JavaScript判断FileUpload控件上传文件类型
2015/09/28 Javascript
JS函数arguments数组获得实际传参数个数的实现方法
2016/05/28 Javascript
详细分析Javascript中创建对象的四种方式
2016/08/17 Javascript
js实现五星评价功能
2017/03/08 Javascript
基于BootStrap的文本编辑器组件Summernote
2017/10/27 Javascript
详解基于mpvue微信小程序下载远程图片到本地解决思路
2019/05/16 Javascript
jQuery 判断元素是否存在然后按需加载内容的实现代码
2020/01/16 jQuery
[01:07:47]Secret vs Optic Supermajor 胜者组 BO3 第一场 6.4
2018/06/05 DOTA
Linux系统上Nginx+Python的web.py与Django框架环境
2015/12/25 Python
windows 10下安装搭建django1.10.3和Apache2.4的方法
2017/04/05 Python
Python3利用SMTP协议发送E-mail电子邮件的方法
2017/09/30 Python
python监测当前联网状态并连接的实例
2018/12/18 Python
python协程gevent案例 爬取斗鱼图片过程解析
2019/08/27 Python
CSS3 完美实现圆角效果
2009/07/13 HTML / CSS
FC-Moto西班牙:摩托车手最大的购物场所之一
2019/04/11 全球购物
康拓普公司Java笔面试
2016/09/23 面试题
大学生优秀班干部事迹材料
2014/05/26 职场文书
教师党员公开承诺事项
2014/05/28 职场文书
经济贸易系求职信
2014/08/04 职场文书
2014年文员工作总结
2014/11/18 职场文书
2015年银行大堂经理工作总结
2015/04/24 职场文书
导游词之无锡古运河
2019/11/14 职场文书
JavaScript数组reduce()方法的语法与实例解析
2021/07/07 Javascript