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 web对话框与弹出窗口
Feb 22 Javascript
鼠标移到导航当前位置的LI变色处于选中状态
Aug 23 Javascript
一个JS函数搞定网页标题(title)闪动效果
May 13 Javascript
chrome下img加载对height()的影响示例探讨
May 26 Javascript
2种jQuery 实现刮刮卡效果
Feb 01 Javascript
一看就懂:jsonp详解
Jun 01 Javascript
AngularJS学习笔记之基本指令(init、repeat)
Jun 16 Javascript
Javascript操作表单实例讲解(下)
Jun 20 Javascript
JavaScript中值类型和引用类型的区别
Feb 23 Javascript
JSONP跨域请求
Mar 02 Javascript
实现div滚动条默认最底部以及默认最右边的示例代码
Nov 15 Javascript
vue实现2048小游戏功能思路详解
May 09 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
dedecms模版制作使用方法
2007/04/03 PHP
PHP引用返回用法示例
2016/05/28 PHP
JS Timing
2007/04/21 Javascript
JavaScript写的一个自定义弹出式对话框代码
2010/01/17 Javascript
JQuery 1.4 中的Ajax问题
2010/01/23 Javascript
深入理解Javascript动态方法调用与参数修改的问题
2013/12/10 Javascript
jQuery避免$符和其他JS库冲突的方法对比
2014/02/20 Javascript
Jquery实现兼容各大浏览器的Enter回车切换输入焦点的方法
2014/09/01 Javascript
JavaScript判断页面加载完之后再执行预定函数的技巧
2016/05/17 Javascript
JavaScript 数组some()和filter()的用法及区别
2016/05/20 Javascript
使用Curl命令查看请求响应时间方法
2016/11/04 Javascript
jQuery.parseHTML() 函数详解
2017/01/09 Javascript
基于jQuery实现瀑布流页面
2017/04/11 jQuery
JS+Ajax实现百度智能搜索框
2017/08/04 Javascript
详解使用Typescript开发node.js项目(简单的环境配置)
2017/10/09 Javascript
js实现以最简单的方式将数组元素添加到对象中的方法
2017/12/20 Javascript
Vue-cropper 图片裁剪的基本原理及思路讲解
2018/04/17 Javascript
vue 中引用gojs绘制E-R图的方法示例
2018/08/24 Javascript
nodejs异步编程基础之回调函数用法分析
2018/12/26 NodeJs
vue-cli3 配置开发与测试环境详解
2019/05/17 Javascript
详解js中let与var声明变量的区别
2020/04/05 Javascript
基于vue实现简易打地鼠游戏
2020/08/21 Javascript
[51:17]VGJ.T vs Mineski 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
[48:18]DOTA2-DPC中国联赛 正赛 RNG vs Dynasty BO3 第二场 1月29日
2021/03/11 DOTA
python函数缺省值与引用学习笔记分享
2013/02/10 Python
python获取豆瓣电影简介代码分享
2014/01/16 Python
python2.7 mayavi 安装图文教程(推荐)
2017/06/22 Python
Python实现的读取文件内容并写入其他文件操作示例
2019/04/09 Python
Python3远程监控程序的实现方法
2019/07/15 Python
详解python中的数据类型和控制流
2019/08/08 Python
python环境下安装opencv库的方法
2020/03/05 Python
下列程序在32位linux或unix中的结果是什么
2014/03/25 面试题
党员干部2014全国两会学习心得体会
2014/03/10 职场文书
人大代表选举标语
2014/10/07 职场文书
jupyter notebook保存文件默认路径更改方法汇总(亲测可以)
2021/06/09 Python
Mybatis是这样防止sql注入的
2021/12/06 Java/Android