鉴于两条绝对路径或相对路径A
和B
,我想知道B
是否在“目录A
内” - 而不仅仅是目录本身,但可能在子目录中。我想在没有大量fs.readdir
电话的情况下这样做。
例如,如果A
为/
且B
为/foo/bar/baz
,则B
在A
范围内应该非常明显;递归readdir
方法效率极低。
一个明显的想法是将两个路径转换为绝对形式,然后检查B
的绝对路径的字符串形式是否以A
的字符串形式开头。但是,有两个问题:
我会接受调用Linux实用程序的答案(除了rm -rf
... 技术上可用于解决问题)或第三方节点库。< / p>
答案 0 :(得分:8)
var fs = require('fs');
var a = fs.realpathSync('/home/mak/www'); // /var/www
var b = fs.realpathSync('/var/www/test/index.html');
var b_in_a = b.indexOf(a) == 0;
var a_is_dir = fs.statSync(a).isDirectory();
fs.*Sync
也有异步版本,请参阅fs module。
fs.realpathSync
和fs.statSync
将抛出。
答案 1 :(得分:0)
我建议:
function isWithin(outer, inner) {
const rel = path.relative(outer, inner);
return !rel.startsWith("../") && rel !== '..';
}