Deskripsi metode:
Dapatkan jalan yang sebenarnya.
Jalur relatif dapat diselesaikan menggunakan proses.cwd.
tata bahasa:
Salinan kode adalah sebagai berikut:
fs.realpath (path, [cache], [callback (err, resolvedpath)])
Karena metode ini milik modul FS, perlu untuk memperkenalkan modul FS sebelum digunakan (var fs = membutuhkan ("fs"))
Menerima parameter:
jalur jalur
Cache Opsional, jalur yang dipetakan secara literal dapat digunakan untuk memaksa jalur tertentu untuk menyelesaikan atau menghindari fs.stat tambahan perlu mengetahui objek jalur yang sebenarnya.
panggilan balik balik
Pengecualian err
alamat sungguhan yang diselesaikan
contoh:
Salinan kode adalah sebagai berikut:
var cache = {'/etc': '/private/etc'};
fs.realpath ('/etc/passwd', cache, function (err, resolvedpath) {
if (err) lempar err;
Console.log (ResolvedPath);
});
Kode Sumber:
Salinan kode adalah sebagai berikut:
fs.realpath = fungsi realpath (p, cache, cb) {
if (! util.isfunction (cb)) {
CB = MaybeCallback (cache);
cache = null;
}
// Buat P adalah mutlak
p = pathmodule.resolve (p);
if (cache && object.prototype.hasownproperty.call (cache, p)) {
Return Process.nexttick (CB.Bind (null, null, cache [p]));
}
var asli = p,
seelinks = {},
knowhard = {};
// posisi karakter saat ini di p
var pos;
// jalur parsial sejauh ini, termasuk tebasan trailing jika ada
arus var;
// jalur parsial tanpa tebasan trailing (kecuali saat menunjuk pada root)
basis var;
// jalur parsial yang dipindai di babak sebelumnya, dengan slash
var sebelumnya;
awal();
fungsi start () {
// lewati akar
var m = splitrootre.exec (p);
pos = m [0] .length;
saat ini = m [0];
basis = m [0];
Sebelumnya = '';
// Di Windows, periksa apakah root ada. Di UNIX tidak perlu.
if (isWindows &&! knowhard [base]) {
fs.lstat (base, function (err) {
if (err) kembalikan cb (err);
Dikenalhard [base] = true;
LINGKARAN();
});
} kalau tidak {
Process.nexttick (loop);
}
}
// Berjalanlah menyusuri jalan setapak, bertukar jalan yang tertaut untuk mereka yang sebenarnya
// nilai
function loop () {
// Berhenti jika dipindai di akhir jalan
if (pos> = p.length) {
if (cache) cache [asli] = p;
mengembalikan CB (null, p);
}
// Temukan bagian selanjutnya
nextPartre.LastIndex = pos;
var result = nextPartre.exec (p);
Sebelumnya = saat ini;
saat ini += hasil [0];
basis = hasil sebelumnya + [1];
pos = nextPartre.LastIndex;
// lanjutkan jika bukan symlink
if (dikenal [base] || (cache && cache [base] === base)) {
return Process.nexttick (loop);
}
if (cache && object.prototype.hasownproperty.call (cache, base)) {
// Tautan simbolik yang dikenal. Tidak perlu statistik lagi.
return gotresolvedlink (cache [base]);
}
return fs.lstat (base, gotstat);
}
fungsi gotstat (err, stat) {
if (err) kembalikan cb (err);
// Jika bukan symlink, lewati bagian jalur berikutnya
if (! stat.issymboliclink ()) {
Dikenalhard [base] = true;
if (cache) cache [base] = base;
return Process.nexttick (loop);
}
// stat & baca tautan jika tidak dibaca sebelumnya
// hubungi Gottarget segera setelah target tautan diketahui
// dev/ino selalu mengembalikan 0 pada windows, jadi lewati cek.
if (! isWindows) {
var id = stat.dev.tostring (32) + ':' + stat.ino.tostring (32);
if (seenlinks.hasownproperty (id)) {
return gottarget (null, seelinks [id], base);
}
}
fs.stat (base, function (err) {
if (err) kembalikan cb (err);
fs.readlink (basis, fungsi (err, target) {
if (! isWindows) seelinks [id] = target;
Gottarget (err, target);
});
});
}
fungsi gottarget (err, target, base) {
if (err) kembalikan cb (err);
var resolvedlink = pathmodule.resolve (sebelumnya, target);
if (cache) cache [base] = resolvedLink;
gotresolvedlink (resolvedlink);
}
fungsi gotresolvedlink (resolvedlink) {
// menyelesaikan tautan, lalu mulai dari awal
p = pathmodule.resolve (ResolvedLink, p.slice (pos));
awal();
}
};