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中,为什么要尽可能使用局部变量?
Apr 06 Javascript
鼠标悬浮停留三秒后自动显示大图js代码
Sep 09 Javascript
使用jQuery获取data-的自定义属性
Nov 10 Javascript
学习javascript文件加载优化
Feb 19 Javascript
jQuery动态修改字体大小的方法【测试可用】
Sep 09 Javascript
JavaScript 最佳实践:帮你提升代码质量
Dec 03 Javascript
JavaScript中 this 指向问题深度解析
Feb 21 Javascript
JavaScript数组和对象的复制
Mar 21 Javascript
Javascript中this关键字指向问题的测试与详解
Aug 11 Javascript
vue-cli开发时,关于ajax跨域的解决方法(推荐)
Feb 03 Javascript
JavaScript去掉数组重复项的方法分析【测试可用】
Jul 19 Javascript
angular2/ionic2 实现搜索结果中的搜索关键字高亮的示例
Aug 17 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 无限级数据JSON格式及JS解析
2010/07/17 PHP
Window 7/XP 安装Apache 2.4与PHP 5.4 的过程详解
2013/06/02 PHP
一组PHP加密解密函数分享
2014/06/05 PHP
PHP递归遍历指定目录的文件并统计文件数量的方法
2015/03/24 PHP
javascript中的遍历for in 以及with的用法
2014/12/22 Javascript
JavaScript和HTML DOM的区别与联系及Javascript和DOM的关系
2015/11/15 Javascript
jQuery滚动加载图片实现原理
2015/12/14 Javascript
用JavaScript动态建立或增加CSS样式表的实现方法
2016/05/20 Javascript
JavaScript禁止用户多次提交的两种方法
2016/07/24 Javascript
javascript 解决浏览器不支持的问题
2016/09/24 Javascript
javascript函数的四种调用模式
2017/01/08 Javascript
HTML5 js实现拖拉上传文件功能
2020/11/20 Javascript
Easyui使用Dialog行内按钮布局的实例
2017/07/27 Javascript
基于datepicker定义自己的angular时间组件的示例
2018/03/14 Javascript
详解Vue源码学习之双向绑定
2019/04/10 Javascript
详解Vue 项目中的几个实用组件(ts)
2019/10/29 Javascript
原生js实现密码强度验证功能
2020/03/18 Javascript
javascript canvas时钟模拟器
2020/07/13 Javascript
纯js+css实现在线时钟
2020/08/18 Javascript
[02:33]2018DOTA2亚洲邀请赛赛前采访——LGD
2018/04/04 DOTA
用Python解析XML的几种常见方法的介绍
2015/04/09 Python
Python实现二叉堆
2016/02/03 Python
TensorFlow神经网络优化策略学习
2018/03/09 Python
PyQt5实现下载进度条效果
2018/04/19 Python
keras做CNN的训练误差loss的下降操作
2020/06/22 Python
详细分析Python可变对象和不可变对象
2020/07/09 Python
详解selenium + chromedriver 被反爬的解决方法
2020/10/28 Python
html5 音乐播放器 audio 标签使用概述
2013/07/15 HTML / CSS
HTML5画渐变背景图片并自动下载实现步骤
2013/11/18 HTML / CSS
银行实习人员自我鉴定
2013/09/22 职场文书
写好自荐信的技巧
2013/11/08 职场文书
会议主持词
2014/03/17 职场文书
小学标准化建设汇报材料
2014/08/16 职场文书
2015年医院护理部工作总结
2015/04/23 职场文书
使用PDF.js渲染canvas实现预览pdf的效果示例
2021/04/17 Javascript
Spring中bean集合注入的方法详解
2022/07/07 Java/Android