Node.js 中确定一个路径是否是另一个路径的子目录

2024-01-07

我正在研究一个MQTT 处理程序 https://github.com/jsdario/replyer我想为每个有事件侦听器的父目录发出一个事件。例如:

如果有以下可用的 MQTT 路径,其中有下标 – 这些路径有事件监听器 –

  • test
  • replyer/request
  • test/replyer/request

有人发表了有关该主题的文章test/replyer/request/@issuer,应该发出 2 个事件:test, test/replyer/request.

鉴于任何路径都是可能的,并且没有可用的有效事件列表,我们必须仅检查一条路径是否是另一条路径的父级。我们可以用正则表达式来做到这一点吗?如果是这样,它会是什么样子?有更简单/更有效的解决方案吗?


让 Node 自己来做这个工作。

const path = require('path');
const relative = path.relative(parent, dir);
return relative && !relative.startsWith('..') && !path.isAbsolute(relative);

它也为您进行标准化。

const path = require('path');

const tests = [
  ['/foo', '/foo'],
  ['/foo', '/bar'],
  ['/foo', '/foobar'],
  ['/foo', '/foo/bar'],
  ['/foo', '/foo/../bar'],
  ['/foo', '/foo/./bar'],
  ['/bar/../foo', '/foo/bar'],
  ['/foo', './bar'],
  ['C:\\Foo', 'C:\\Foo\\Bar'],
  ['C:\\Foo', 'C:\\Bar'],
  ['C:\\Foo', 'D:\\Foo\\Bar'],
];

tests.forEach(([parent, dir]) => {
    const relative = path.relative(parent, dir);
    const isSubdir = relative && !relative.startsWith('..') && !path.isAbsolute(relative);
    console.log(`[${parent}, ${dir}] => ${isSubdir} (${relative})`);
});

也可在 Windows 上跨驱动器运行。

[/foo, /foo] => false ()
[/foo, /bar] => false (..\bar)
[/foo, /foobar] => false (..\foobar)
[/foo, /foo/bar] => true (bar)
[/foo, /foo/../bar] => false (..\bar)
[/foo, /foo/./bar] => true (bar)
[/bar/../foo, /foo/bar] => true (bar)
[/foo, ./bar] => false (..\Users\kozhevnikov\Desktop\bar)
[C:\Foo, C:\Foo\Bar] => true (Bar)
[C:\Foo, C:\Bar] => false (..\Bar)
[C:\Foo, D:\Foo\Bar] => false (D:\Foo\Bar)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Node.js 中确定一个路径是否是另一个路径的子目录 的相关文章

随机推荐

  • 通过 link_to ruby​​ on Rails 传递参数

    我有这行代码 当我使用 add to cart 方法时 我该如何调用 car car Car new params car 这不起作用 因为它说我正在尝试将其字符串化 我不明白出了什么问题 因为我用它来创建新用户并且效果很好 顺便说一句 汽
  • Java 8 接口/类加载器发生变化?

    我发现 Java 1 7 51 和 Java 1 8 20 之间存在一些困难 初始情况 一个接口 interface InterfaceA public void doSomething 两类 public class ClassA imp
  • Dagger 2 注入 Android 应用程序上下文

    我正在使用 Dagger 2 并且它可以正常工作 但是我现在需要访问Android应用程序上下文 我不清楚如何注入和访问上下文 我尝试按如下方式执行此操作 Module public class MainActivityModule pri
  • .oldValue 控件属性上出现错误 3251

    我目前正在努力向 MS Access 2010 数据库添加审计跟踪 但我正在努力解决 错误 3251 此类型对象不支持操作 这是我的审计跟踪模块的代码 大部分排列的代码来自网络 Public Function auditChanges Re
  • vstest.console.exe 可以在没有安全证书的情况下运行 appx

    我正在尝试在命令行上使用 MSBuild 在构建代理上设置自动构建 我目前关注的两个项目是 UWP 及其关联的单元测试项目 要构建 我必须使用这个 p AppxPackageSigningEnabled false 否则 我收到此错误 er
  • 如何使用CSS 3d矩阵创建弯曲变形效果

    我正在尝试使用 css3 在 ios 中复制吸吮效果 webkit transform matrix3d 财产 但是 我无法像图片中那样管理弯曲边缘 我自己最接近的解决方案如下 webkit transform matrix3d 0 85
  • 面临 XLWT 和 XLRD 的问题 - 同时读写

    我面临 xlrd 和 xlwt 的问题 粘贴示例代码 以下 from xlwt import Workbook Formula XFStyle import xlrd book Workbook sheet1 book add sheet
  • Whatsapp 如何在 iOS 中更快地从地址簿中获取更新的联系人?

    我的发现 我正在设计一个逻辑来与我的后端同步联系人 我浏览了一些在 IOS 中做同样事情的应用程序 我将以 WhatsApp 为例 我发现当我更新 Native Addressbook 中的任何联系人时 它会以一小部分反映到 Whatsap
  • 确定数组的一半以上是否在不同数组中重复

    我正在看以下内容来自 Glassdoor 的问题 http www glassdoor com Interview Given N credits cards determine if more than half of them belo
  • C 中指向指针的问题

    我试图用 C 语言编写某种列表 而不为列表的头部创建全局变量 但我遇到了一些麻烦 我最初的代码是这样的 include
  • eclipse java代码显示行号

    我需要在 eclipse 上安装哪些插件才能使 java 文件显示行号 在 xml html 上显示行号怎么样 还有一种更简单的方法 只需右键单击装订线 代码所在的编辑器窗口的左边框 并启用它们 那里有一个特定的选项
  • 是否可以在 update_item 中结合 if_not_exists 和 list_append

    我正在尝试使用update itemboto3 中 DynamoDB 的功能 我现在正在努力更新项目列表 如果列表尚不存在 我想创建一个新列表 否则附加到现有列表 使用UpdateExpression形式的SET my list list
  • 限制列只接受 2 个值

    我的表中有一个名为 患者类型 的列 我想确保只有 2 个值可以插入到该列中 无论是 opd 还是 recognize 除此之外 所有其他输入都无效 下面是我想要的一个例子 如何确保该列仅接受 opd 或 admissed 作为 患者类型 列
  • MS Sql 服务器中的累计总数[重复]

    这个问题在这里已经有答案了 可能的重复 在 Sql Server 中计算运行总计 https stackoverflow com questions 860966 calculate a running total in sqlserver
  • 将 geom_boxplot 与 geom_line 结合起来

    我想使用组合箱线图和线图ggplot2 然而 我正在努力为每个组安排线路 g 连接 x 轴上类别的点 为了演示这个问题 df lt data frame x rep letters 1 3 each 5 y c 1 5 sample 10
  • 谷歌浏览器中的 ReportViewer 问题

    我在我的 asp net mvc C 应用程序中使用 Reportviewer 在 IE 和 Firefox 中 报表查看器看起来不错 但在 Chrome 中 标题和正文会缩小 我能够按照中的建议纠正标题显示问题http www mazso
  • 如何在不刷新的情况下更新页面

    在Gmail中 当收到新邮件时 页面会自动显示该邮件而不刷新 这是怎么做到的 您可以使用以下命令定期发送 AJAX 请求window setInterval http developer mozilla org en DOM window
  • 如何在 Symfony 2 / Doctrine 中启用 ENUM

    跑步时doctrine mapping import我收到错误 请求未知的数据库类型枚举 Doctrine DBAL Platforms MySqlPlatform 可能不支持它 看来我需要设置use native enum to true
  • TamperMonkey 中的 GM_addStyle 等效项

    是否有与 GreaseMonkey 相当的 TamperMonkeyGM addStyle添加CSS的方法 在 GreaseMonkey 中 您可以向多个元素添加一堆 CSS 属性 如下所示 GM addStyle body color w
  • Node.js 中确定一个路径是否是另一个路径的子目录

    我正在研究一个MQTT 处理程序 https github com jsdario replyer我想为每个有事件侦听器的父目录发出一个事件 例如 如果有以下可用的 MQTT 路径 其中有下标 这些路径有事件监听器 test replyer