假设我们有两条路径:
c:\foo\bar\baz 和 c:\foo\bar
是否有任何包/方法可以帮助我确定一个是否是另一个的子目录?我正在寻找一个跨平台的选择.
您可以尝试使用path.filepath.Rel():
func Rel(basepath, targpath string) (string, error)
Run Code Online (Sandbox Code Playgroud)
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.
我还没有找到适用于所有类型路径的可靠解决方案,但最好的方法是按照 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 路径将需要额外检查。
| 归档时间: |
|
| 查看次数: |
1786 次 |
| 最近记录: |