加入收藏 | 设为首页 | 会员中心 | 我要投稿 开发网_开封站长网 (http://www.0378zz.com/)- 科技、AI行业应用、媒体智能、低代码、办公协同!
当前位置: 首页 > 服务器 > 搭建环境 > Linux > 正文

node.js中的fs.realpath方法使用说明

发布时间:2016-11-24 02:22:15 所属栏目:Linux 来源:站长网
导读:方法说明: 获取真实路径。 可以使用process.cwd解决相对路径。 语法: 复制代码 代码如下: fs.realpath(path, [cache], [callback(err , resolvedPath)]) 由于该方法属于fs模块,使用前需要引入fs模块(var fs= require(“fs”) ) 接收参数: pathnbsp;n

方法说明:

获取真实路径。

可以使用process.cwd解决相对路径。

语法:

复制代码 代码如下:
fs.realpath(path, [cache], [callback(err , resolvedPath)])

由于该方法属于fs模块,使用前需要引入fs模块(var fs= require(“fs”) )

接收参数:

pathnbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp; 路径

cachenbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp; 可选,一个文字的映射路径可用于强制一个特定的路径解决或避免额外的fs.stat需要知道真正的路径对象。

callbacknbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp; 回调

errnbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp; 异常

resolvedPathnbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp; 真实地址

例子:

复制代码 代码如下:
var cache = {'/etc':'/private/etc'};
fs.realpath('/etc/passwd', cache, function (err, resolvedPath) {
nbsp; if (err) throw err;
nbsp; console.log(resolvedPath);
});

源码:

复制代码 代码如下:
fs.realpath = function realpath(p, cache, cb) {
nbsp; if (!util.isFunction(cb)) {
nbsp;nbsp;nbsp; cb = maybeCallback(cache);
nbsp;nbsp;nbsp; cache = null;
nbsp; }
nbsp; // make p is absolute
nbsp; p = pathModule.resolve(p);
nbsp; if (cache Object.prototype.hasOwnProperty.call(cache, p)) {
nbsp;nbsp;nbsp; return process.nextTick(cb.bind(null, null, cache[p]));
nbsp; }
nbsp; var original = p,
nbsp;nbsp;nbsp;nbsp;nbsp; seenLinks = {},
nbsp;nbsp;nbsp;nbsp;nbsp; knownHard = {};
nbsp; // current character position in p
nbsp; var pos;
nbsp; // the partial path so far, including a trailing slash if any
nbsp; var current;
nbsp; // the partial path without a trailing slash (except when pointing at a root)
nbsp; var base;
nbsp; // the partial path scanned in the previous round, with slash
nbsp; var previous;
nbsp; start();
nbsp; function start() {
nbsp;nbsp;nbsp; // Skip over roots
nbsp;nbsp;nbsp; var m = splitRootRe.exec(p);
nbsp;nbsp;nbsp; pos = m[0].length;
nbsp;nbsp;nbsp; current = m[0];
nbsp;nbsp;nbsp; base = m[0];
nbsp;nbsp;nbsp; previous = '';
nbsp;nbsp;nbsp; // On windows, check that the root exists. On unix there is no need.
nbsp;nbsp;nbsp; if (isWindows !knownHard[base]) {
nbsp;nbsp;nbsp;nbsp;nbsp; fs.lstat(base, function(err) {
nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp; if (err) return cb(err);
nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp; knownHard[base] = true;
nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp; LOOP();
nbsp;nbsp;nbsp;nbsp;nbsp; });
nbsp;nbsp;nbsp; } else {
nbsp;nbsp;nbsp;nbsp;nbsp; process.nextTick(LOOP);
nbsp;nbsp;nbsp; }
nbsp; }
nbsp; // walk down the path, swapping out linked pathparts for their real
nbsp; // values
nbsp; function LOOP() {
nbsp;nbsp;nbsp; // stop if scanned past end of path
nbsp;nbsp;nbsp; if (pos gt;= p.length) {
nbsp;nbsp;nbsp;nbsp;nbsp; if (cache) cache[original] = p;
nbsp;nbsp;nbsp;nbsp;nbsp; return cb(null, p);
nbsp;nbsp;nbsp; }
nbsp;nbsp;nbsp; // find the next part
nbsp;nbsp;nbsp; nextPartRe.lastIndex = pos;
nbsp;nbsp;nbsp; var result = nextPartRe.exec(p);
nbsp;nbsp;nbsp; previous = current;
nbsp;nbsp;nbsp; current += result[0];
nbsp;nbsp;nbsp; base = previous + result[1];
nbsp;nbsp;nbsp; pos = nextPartRe.lastIndex;
nbsp;nbsp;nbsp; // continue if not a symlink
nbsp;nbsp;nbsp; if (knownHard[base] || (cache cache[base] === base)) {
nbsp;nbsp;nbsp;nbsp;nbsp; return process.nextTick(LOOP);
nbsp;nbsp;nbsp; }
nbsp;nbsp;nbsp; if (cache Object.prototype.hasOwnProperty.call(cache, base)) {
nbsp;nbsp;nbsp;nbsp;nbsp; // known symbolic link. no need to stat again.
nbsp;nbsp;nbsp;nbsp;nbsp; return gotResolvedLink(cache[base]);
nbsp;nbsp;nbsp; }
nbsp;nbsp;nbsp; return fs.lstat(base, gotStat);
nbsp; }
nbsp; function gotStat(err, stat) {
nbsp;nbsp;nbsp; if (err) return cb(err);
nbsp;nbsp;nbsp; // if not a symlink, skip to the next path part
nbsp;nbsp;nbsp; if (!stat.isSymbolicLink()) {
nbsp;nbsp;nbsp;nbsp;nbsp; knownHard[base] = true;
nbsp;nbsp;nbsp;nbsp;nbsp; if (cache) cache[base] = base;
nbsp;nbsp;nbsp;nbsp;nbsp; return process.nextTick(LOOP);
nbsp;nbsp;nbsp; }
nbsp;nbsp;nbsp; // stat read the link if not read before
nbsp;nbsp;nbsp; // call gotTarget as soon as the link target is known
nbsp;nbsp;nbsp; // dev/ino always return 0 on windows, so skip the check.
nbsp;nbsp;nbsp; if (!isWindows) {
nbsp;nbsp;nbsp;nbsp;nbsp; var id = stat.dev.toString(32) + ':' + stat.ino.toString(32);
nbsp;nbsp;nbsp;nbsp;nbsp; if (seenLinks.hasOwnProperty(id)) {
nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp; return gotTarget(null, seenLinks[id], base);
nbsp;nbsp;nbsp;nbsp;nbsp; }
nbsp;nbsp;nbsp; }
nbsp;nbsp;nbsp; fs.stat(base, function(err) {
nbsp;nbsp;nbsp;nbsp;nbsp; if (err) return cb(err);
nbsp;nbsp;nbsp;nbsp;nbsp; fs.readlink(base, function(err, target) {
nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp; if (!isWindows) seenLinks[id] = target;
nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp; gotTarget(err, target);
nbsp;nbsp;nbsp;nbsp;nbsp; });
nbsp;nbsp;nbsp; });
nbsp; }
nbsp; function gotTarget(err, target, base) {
nbsp;nbsp;nbsp; if (err) return cb(err);
nbsp;nbsp;nbsp; var resolvedLink = pathModule.resolve(previous, target);
nbsp;nbsp;nbsp; if (cache) cache[base] = resolvedLink;
nbsp;nbsp;nbsp; gotResolvedLink(resolvedLink);
nbsp; }
nbsp; function gotResolvedLink(resolvedLink) {
nbsp;nbsp;nbsp; // resolve the link, then start over
nbsp;nbsp;nbsp; p = pathModule.resolve(resolvedLink, p.slice(pos));
nbsp;nbsp;nbsp; start();
nbsp; }
};

(编辑:开发网_开封站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读