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 關注
- 373 瀏覽
添加回答
舉報