方法说明:
获取真实路径。
可以使用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; }
};
(编辑:开发网_开封站长网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|