繁体   English   中英

如何确定文件是否在 Node.js 的目录中?

[英]How do I find out whether a file is within a directory with Node.js?

给定两个绝对或相对路径AB ,我想知道B是否在目录A的“内部”——不仅在目录本身中,还可能在子目录中。 我想在没有大量fs.readdir调用的情况下执行此操作。

例如,如果A/并且B/foo/bar/baz ,那么BA内应该很明显; 递归readdir方法效率极低。

一个明显的想法是将两个路径都转换为绝对形式,然后检查B的绝对路径的字符串形式是否以A的字符串形式开头。 但是,有两个问题:

  1. 如何将相对路径转换为绝对路径?
  2. 符号链接之类的呢?

我将接受调用 Linux 实用程序(除了rm -rf ...在技术上可用于解决问题)或第三方节点库的答案。

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 模块

如果路径不存在, fs.realpathSyncfs.statSync将抛出。

我建议这样做:

const path = require('path')

function isWithin(outer, inner) {
    const rel = path.relative(outer, inner);
    return !rel.startsWith('../') && rel !== '..';
}

它使用path.relative来计算inner相对于outer的路径。 如果不包含它,则生成路径的第一个组件将是.. ,这就是我们要检查的内容。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM