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 相关文章推荐
使用JQUERY Tabs插件宿主IFRAMES
Jan 01 Javascript
jquery动画1.加载指示器
Aug 24 Javascript
js图片向右一张张滚动效果实例代码
Nov 23 Javascript
JS作为值的函数用法示例
Jun 20 Javascript
js编写三级联动简单案例
Dec 21 Javascript
underscore之function_动力节点Java学院整理
Jul 11 Javascript
浅谈Vue-cli 命令行工具分析
Nov 22 Javascript
JS实现留言板功能[楼层效果展示]
Dec 27 Javascript
分享5个顶级的JavaScript Ajax组件库
Sep 16 Javascript
Angular value与ngValue区别详解
Nov 27 Javascript
React学习之JSX与react事件实例分析
Jan 06 Javascript
Vue路由的模块自动化与统一加载实现
Jun 05 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
第十三节--对象串行化
2006/11/16 PHP
Php Image Resize图片大小调整的函数代码
2011/01/17 PHP
深入理解PHP之OpCode原理详解
2016/06/01 PHP
php5.3后静态绑定用法详解
2016/11/11 PHP
PHP流Streams、包装器wrapper概念与用法实例详解
2017/11/17 PHP
详解Laravel5.6 Passport实现Api接口认证
2018/07/27 PHP
javascript 二分法(数组array)
2010/04/24 Javascript
指定位置如果有图片显示图片,无图片显示广告的JS
2010/06/05 Javascript
基于jQuery的可用于选项卡及幻灯的切换插件
2011/03/28 Javascript
Checbox的操作含已选、未选及判断代码
2013/11/07 Javascript
使用jquery修改表单的提交地址基本思路
2014/06/04 Javascript
使用JSON.parse将json字符串转换成json对象的时候会出错
2014/09/04 Javascript
浅谈jQuery中的事件
2015/03/23 Javascript
AngularJS的内置过滤器详解
2015/05/14 Javascript
jQuery简单实现中间浮窗效果
2016/09/04 Javascript
javascript计算对象长度的方法
2017/10/25 Javascript
JavaScript设计模式之装饰者模式定义与应用示例
2018/07/25 Javascript
JS使用百度地图API自动获取地址和经纬度操作示例
2019/04/16 Javascript
Angular Excel 导入与导出的实现代码
2019/04/17 Javascript
Vue通过配置WebSocket并实现群聊功能
2019/12/31 Javascript
你知道JavaScript Symbol类型怎么用吗
2020/01/08 Javascript
js实现浏览器打印功能的示例代码
2020/07/15 Javascript
[43:03]完美世界DOTA2联赛PWL S2 PXG vs Magma 第二场 11.21
2020/11/24 DOTA
Python生成随机密码
2015/03/10 Python
Python的语言类型(详解)
2017/06/24 Python
python利用socketserver实现并发套接字功能
2018/01/26 Python
关于Flask项目无法使用公网IP访问的解决方式
2019/11/19 Python
python中的socket实现ftp客户端和服务器收发文件及md5加密文件
2020/04/01 Python
基于PyInstaller各参数的含义说明
2021/03/04 Python
HTML5实现经典坦克大战坦克乱走还能发出一个子弹
2013/09/02 HTML / CSS
移动端解决悬浮层(悬浮header、footer)会遮挡住内容的3种方法
2015/03/27 HTML / CSS
英国二手物品交易网站:Preloved
2017/10/06 全球购物
保密普查工作实施方案
2014/02/25 职场文书
弘扬焦裕禄精神践行三严三实心得体会
2014/10/13 职场文书
简历自我评价范文
2019/04/24 职场文书
Python爬取用户观影数据并分析用户与电影之间的隐藏信息!
2021/06/29 Python