ホームページ  >  記事  >  ウェブフロントエンド  >  node.js_node.js での fs.realpath メソッドの使用手順

node.js_node.js での fs.realpath メソッドの使用手順

WBOY
WBOYオリジナル
2016-05-16 16:26:401288ブラウズ

メソッドの説明:

実際のパスを取得します。

相対パスは process.cwd を使用して解決できます。

文法:

コードをコピーします コードは次のとおりです:

fs.realpath(path, [キャッシュ], [callback(err,solvedPath)])

このメソッドは fs モジュールに属しているため、使用する前に fs モジュールを導入する必要があります (var fs= require(“fs”) )

パラメータを受信します:

パス パス

キャッシュ‐ ‐ ‐ ‐ ‐ ‐ オプションで、リテラルのマップされたパスを使用して、特定のパスを強制的に解決したり、実際のパス オブジェクトを知るための追加の fs.stat の必要性を回避したりできます。

コールバック

エラー例外

resolvedPath 実際のアドレス

例:

コードをコピーします コードは次のとおりです:
var キャッシュ = {'/etc':'/private/etc'};
fs.realpath('/etc/passwd', キャッシュ, 関数 (err,solvedPath) {
if (err) throw err;
console.log(resolvedPath);
});

ソースコード:

コードをコピー コードは次のとおりです:

fs.realpath = 関数 realpath(p, キャッシュ, cb) {
  if (!util.isFunction(cb)) {
    cb = mightCallback(cache);
    キャッシュ = null;
  }
  // p を絶対値にする
  p = pathModule.resolve(p);
  if (キャッシュ && Object.prototype.hasOwnProperty.call(cache, p)) {
    return process.nextTick(cb.bind(null, null, cache[p]));
  }
  var オリジナル = p,
      見られたリンク = {},
      既知ハード = {};
  // p
内の現在の文字位置   var pos;
  // これまでの部分パス(末尾のスラッシュがあればそれも含む)
  var current;
  // 末尾のスラッシュのない部分パス (ルートを指す場合を除く)
  var ベース;
  // 前のラウンドでスキャンされた部分パス、スラッシュ
  var 前;
  start();
  関数 start() {
    // ルートをスキップ
    var m = splitRootRe.exec(p);
    pos = m[0].length;
    現在 = m[0];
    ベース = m[0];
    前 = '';
    // Windows では、ルートが存在することを確認します。 UNIX では必要ありません。
    if (isWindows && !knownHard[base]) {
      fs.lstat(base, function(err) {
        if (err) return cb(err);
        knownHard[base] = true;
        LOOP();
      });
    } else {
      process.nextTick(LOOP);
    }
  }
  // パスをたどって、リンクされたパスパーツを実際のパスパーツと交換します
  // 値
  関数 LOOP() {
    // パスの終端を超えてスキャンされた場合は停止します
    if (pos >= p.length) {
      if (キャッシュ) キャッシュ[オリジナル] = p;
      return cb(null, p);
    }
    // 次の部分を見つけます
    nextPartRe.lastIndex = pos;
    var result = nextPartRe.exec(p);
    前 = 現在;
    現在 = 結果[0];
    ベース = 前の結果[1];
    pos = nextPartRe.lastIndex;
    // シンボリックリンクでない場合は続行
    if (knownHard[base] || (キャッシュ && キャッシュ[ベース] === ベース)) {
      return process.nextTick(LOOP);
    }
    if (キャッシュ && Object.prototype.hasOwnProperty.call(キャッシュ, ベース)) {
      // 既知のシンボリック リンク。再度統計を行う必要はありません。
      return gotResolvedLink(cache[base]);
    }
    return fs.lstat(base, gotStat);
  }
  関数 gotStat(err, stat) {
    if (err) return cb(err);
    // シンボリックリンクでない場合は、次のパス部分にスキップします
    if (!stat.isSymbolicLink()) {
      knownHard[base] = true;
      if (キャッシュ) キャッシュ[ベース] = ベース;
      return process.nextTick(LOOP);
    }
    // 統計を取得し、前に読んでいない場合はリンクを読み取ります
    // リンクターゲットが判明したらすぐに gotTarget を呼び出します
    // Windows では dev/ino は常に 0 を返すため、チェックをスキップします。
    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, ターゲット);
      });
    });
  }
  関数 gotTarget(err, ターゲット, ベース) {
    if (err) return cb(err);
    varsolvedLink = pathModule.resolve(previous, target);
    if (キャッシュ) キャッシュ[ベース] =solvedLink;
    gotResolvedLink(resolvedLink);
  }
  function gotResolvedLink(resolvedLink) {
    // リンクを解決してからやり直します
    p = pathModule.resolve(resolvedLink, p.slice(pos));
    start();
  }
};
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。