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操作ajax返回的json的注意问题!
Feb 23 Javascript
用js实现控件的隐藏及style.visibility的使用
Jun 14 Javascript
判断js中各种数据的类型方法之typeof与0bject.prototype.toString讲解
Nov 07 Javascript
jquery自定义函数的多种方法
Jan 09 Javascript
javascript文本框内输入文字倒计数的方法
Feb 24 Javascript
在Node.js中使用HTTP上传文件的方法
Jun 23 Javascript
使用CoffeeScrip优美方式编写javascript代码
Oct 28 Javascript
JS实现可编辑的后台管理菜单功能【附demo源码下载】
Sep 13 Javascript
BootStrap表单验证实例代码
Jan 13 Javascript
AngularJS集合数据遍历显示的实例
Dec 27 Javascript
详解Vue.js使用Swiper.js在iOS
Sep 10 Javascript
JS实现躲避粒子小游戏
Jun 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中与数组相关的函数
2007/03/22 PHP
php自定义截取中文字符串-utf8版
2017/02/27 PHP
php使用redis的几种常见操作方式和用法示例
2020/02/20 PHP
一个js封装的不错的选项卡效果代码
2008/02/15 Javascript
解决jquery .ajax 在IE下卡死问题的解决方法
2009/10/26 Javascript
javascript面向对象之对象的深入理解
2015/01/13 Javascript
深入理解JavaScript系列(25):设计模式之单例模式详解
2015/03/03 Javascript
JS获取及设置TextArea或input文本框选择文本位置的方法
2015/03/24 Javascript
JS实现支持多选的遍历下拉列表代码
2015/08/20 Javascript
关于验证码在IE中不刷新的快速解决方法
2016/09/23 Javascript
jQuery为DOM动态追加事件的方法
2017/02/16 Javascript
JS 学习总结之正则表达式的懒惰性和贪婪性
2017/07/03 Javascript
结合mint-ui移动端下拉加载实践方法总结
2017/11/08 Javascript
Antd的Table组件嵌套Table以及选择框联动操作
2020/10/24 Javascript
Js实现粘贴上传图片的原理及示例
2020/12/09 Javascript
Vue中使用wangeditor富文本编辑的问题
2021/02/07 Vue.js
手动实现把python项目发布为exe可执行程序过程分享
2014/10/23 Python
Python 装饰器深入理解
2017/03/16 Python
python 实现上传图片并预览的3种方法(推荐)
2017/07/14 Python
Python使用matplotlib填充图形指定区域代码示例
2018/01/16 Python
Python+matplotlib绘制不同大小和颜色散点图实例
2018/01/19 Python
python实现自动发送邮件
2018/06/20 Python
Python使用matplotlib实现基础绘图功能示例
2018/07/03 Python
Flask框架使用DBUtils模块连接数据库操作示例
2018/07/20 Python
浅析Python3 pip换源问题
2020/01/06 Python
Python unittest如何生成HTMLTestRunner模块
2020/09/08 Python
CSS3实现闪烁动画效果的方法
2015/02/09 HTML / CSS
应用服务器有那些
2012/01/19 面试题
介绍一下Prototype的$()函数,$F()函数,$A()函数都是什么作用?
2014/03/05 面试题
大专毕业生自我评价分享
2013/11/10 职场文书
节约用水倡议书
2014/04/16 职场文书
清明节扫墓活动总结
2015/02/09 职场文书
储备店长岗位职责
2015/04/14 职场文书
销售开票员岗位职责
2015/04/15 职场文书
2015年评职称工作总结范文
2015/04/20 职场文书
使用Djongo模块在Django中使用MongoDB数据库
2021/06/20 Python