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

Sri*_*lan 4 go

假设我们有两条路径:

c:\foo\bar\bazc:\foo\bar

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

Von*_*onC 9

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

func Rel(basepath, targpath string) (string, error)
Run Code Online (Sandbox Code Playgroud)

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.


maj*_*aja 6

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

如果两个文件路径都是绝对路径或相对路径(不允许混合),则它可以工作,并且可以在 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
}
Run Code Online (Sandbox Code Playgroud)

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