3 回答
TA贡献1719条经验 获得超6个赞
您可以尝试使用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
。
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 路径将需要额外检查。
TA贡献1828条经验 获得超3个赞
您可以使用函数path.filepath.Match()
匹配报告名称是否与外壳文件名称模式匹配。
例如:
pattern := "C:\foo\bar" + string(filepath.Separator) + "*"
matched, err := filepath.Match(pattern, "C:\foo\bar\baz")
matched应该在哪里true。
- 3 回答
- 0 关注
- 316 浏览
添加回答
举报