Given two absolute or relative paths, A
and B
, I want to find out whether B
is "inside of" the directory A
—not just in the directory itself, but potentially in a subdirectory. I'd like to do this without a potentially huge number of fs.readdir
calls.
For instance, if A
is /
and B
is /foo/bar/baz
, it should be pretty obvious that B
is within A
; the recursive readdir
approach would be extremely inefficient.
One obvious idea is to convert both paths to absolute form, then check if the string form of B
's absolute path starts with the string form of A
's. However, there are two problems:
I'll accept answers that make calls to Linux utilities (other than rm -rf
... which technically could be used to solve the problem) or third-party Node libraries.
The existsSync method of the fs module is used to check if a file or directory exists in the file system.
isDirectory() method returns true if file path is Directory, otherwise returns false.
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
also have asynchronous versions, see fs module.
fs.realpathSync
and fs.statSync
will throw if the path does not exist.
I suggest this:
const path = require('path')
function isWithin(outer, inner) {
const rel = path.relative(outer, inner);
return !rel.startsWith('../') && rel !== '..';
}
It uses path.relative
to compute the path of inner
relative to outer
. If it's not contained, the first component of the resulting path will be ..
, so that's what we check for.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With