为了账号安全,请及时绑定邮箱和手机立即绑定

检查给定路径是否是 golang 中另一个的子目录

检查给定路径是否是 golang 中另一个的子目录

Go
收到一只叮咚 2021-09-10 21:48:05
假设我们有两条路径:c:\foo\bar\baz 和 c:\foo\bar是否有任何包/方法可以帮助我确定一个是否是另一个的子目录?我正在寻找跨平台选项。
查看完整描述

3 回答

?
慕侠2389804

TA贡献1719条经验 获得超6个赞

您可以尝试使用path.filepath.Rel()

func Rel(basepath, targpath string) (string, error)

Rel返回一个相对路径,该路径在词法上等同targpathbasepath使用中间分隔符连接时。
也就是说,Join(basepath, Rel(basepath, targpath))等价于targpath自身

这意味着Rel("c:\foo\bar", "c:\foo\bar\baz")应该是baz,意味着完全包含在 中的子路径c:\foo\bar\baz,并且没有任何“ ../”。
这同样适用于 unix 路径。

这将使c:\foo\bar\baz的子目录c:\foo\bar


查看完整回答
反对 回复 2021-09-10
?
子衿沉夜

TA贡献1828条经验 获得超3个赞

我还没有找到适用于所有类型路径的可靠解决方案,但您可以获得的最佳解决方案是filepath.Rel按照 VonC 的建议使用。


如果两个文件路径都是绝对的或相对的(不允许混合)并且在 Windows 和 Linux 上都有效,则它有效:


func SubElem(parent, sub string) (bool, error) {

    up := ".." + string(os.PathSeparator)


    // path-comparisons using filepath.Abs don't work reliably according to docs (no unique representation).

    rel, err := filepath.Rel(parent, sub)

    if err != nil {

        return false, err

    }

    if !strings.HasPrefix(rel, up) && rel != ".." {

        return true, nil

    }

    return false, nil

}

不过,以驱动器号开头的绝对 Windows 路径将需要额外检查。


查看完整回答
反对 回复 2021-09-10
?
倚天杖

TA贡献1828条经验 获得超3个赞

您可以使用函数path.filepath.Match()


匹配报告名称是否与外壳文件名称模式匹配。


例如:


pattern := "C:\foo\bar" + string(filepath.Separator) + "*"

matched, err := filepath.Match(pattern, "C:\foo\bar\baz")

matched应该在哪里true。


查看完整回答
反对 回复 2021-09-10
  • 3 回答
  • 0 关注
  • 316 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信