-
慕侠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。