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 Array(数组)相关方法简述
Jul 25 Javascript
深入理解JavaScript系列(3) 全面解析Module模式
Jan 15 Javascript
浏览器加载、渲染和解析过程黑箱简析
Nov 29 Javascript
Angular.js与Bootstrap相结合实现表格分页代码
Apr 12 Javascript
有趣的bootstrap走动进度条
Dec 01 Javascript
浅谈struts1 & jquery form 文件异步上传
May 25 jQuery
老生常谈JavaScript面向对象基础与this指向问题
Oct 16 Javascript
jQuery实现模糊搜索功能的方法分析
Jun 29 jQuery
基于vue中keep-alive缓存问题的解决方法
Sep 21 Javascript
详解node和ES6的模块导出与导入
Feb 19 Javascript
js实现的订阅发布者模式简单示例
Mar 14 Javascript
聊聊vue 中的v-on参数问题
Jan 29 Vue.js
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,不用COM,生成excel文件
2006/10/09 PHP
PHP加速 eAccelerator配置和使用指南
2009/06/05 PHP
php printf输出格式使用说明
2010/12/05 PHP
PHP Class&Object -- 解析PHP实现二叉树
2013/06/25 PHP
PHP检测移动设备类mobile detection使用实例
2014/04/14 PHP
Yii框架获取当前controlle和action对应id的方法
2014/12/03 PHP
php数组和链表的区别总结
2019/09/20 PHP
Laravel框架集合用法实例浅析
2020/05/14 PHP
用 JSON 处理缓存
2007/04/27 Javascript
自动最大化窗口的Javascript代码
2013/05/22 Javascript
js去空格技巧分别去字符串前后、左右空格
2013/10/21 Javascript
window.print打印指定div指定网页指定区域的方法
2014/08/04 Javascript
鼠标悬停小图标显示大图标
2016/01/22 Javascript
JavaScript中定时控制Throttle、Debounce和Immediate详解
2016/11/17 Javascript
基于jquery实现多选下拉列表
2017/08/02 jQuery
JavaScript使用Ajax上传文件的示例代码
2017/08/10 Javascript
js微信应用场景之微信音乐相册案例分享
2017/08/11 Javascript
基于 flexible 的 Vue 组件:Toast -- 显示框效果
2017/12/26 Javascript
vue组件与复用详解
2018/04/08 Javascript
详解Nodejs内存治理
2018/05/13 NodeJs
怎样在vue项目下添加ESLint的方法
2019/05/16 Javascript
新手如何快速理解js异步编程
2019/06/24 Javascript
vue 开发之路由配置方法详解
2019/12/02 Javascript
ES6中Set和Map用法实例详解
2020/03/02 Javascript
js实现验证码干扰(动态)
2021/02/23 Javascript
[58:15]2018DOTA2亚洲邀请赛 4.1 小组赛 A组 NB vs Liquid
2018/04/02 DOTA
详解Python编程中基本的数学计算使用
2016/02/04 Python
从零开始学Python第八周:详解网络编程基础(socket)
2016/12/14 Python
机器学习python实战之决策树
2017/11/01 Python
使用Python调取任意数字资产钱包余额功能
2019/08/15 Python
TensorFlow实现保存训练模型为pd文件并恢复
2020/02/06 Python
Python tkinter界面实现历史天气查询的示例代码
2020/08/23 Python
CSS中越界问题的经典解决方案【推荐】
2016/04/19 HTML / CSS
德国传统玻璃制造商:Cristalica
2018/04/23 全球购物
中学生打架检讨书
2014/02/10 职场文书
房屋买卖协议书范本
2014/09/27 职场文书