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

假设我们有两条路径:

c:\foo\bar\baz 和 c:\foo\bar

是否有任何包/方法可以帮助我确定一个是否是另一个的子目录?我正在寻找跨平台选项。


收到一只叮咚
浏览 302回答 3
3回答

慕侠2389804

您可以尝试使用path.filepath.Rel():func Rel(basepath, targpath string) (string, error)Rel返回一个相对路径,该路径在词法上等同targpath于basepath使用中间分隔符连接时。也就是说,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。

子衿沉夜

我还没有找到适用于所有类型路径的可靠解决方案,但您可以获得的最佳解决方案是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 路径将需要额外检查。

倚天杖

您可以使用函数path.filepath.Match()匹配报告名称是否与外壳文件名称模式匹配。例如:pattern := "C:\foo\bar" + string(filepath.Separator) + "*"matched, err := filepath.Match(pattern, "C:\foo\bar\baz")matched应该在哪里true。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go