亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

檢查給定路徑是否是 golang 中另一個的子目錄

檢查給定路徑是否是 golang 中另一個的子目錄

Go
收到一只叮咚 2021-09-10 21:48:05
假設我們有兩條路徑:c:\foo\bar\baz 和 c:\foo\bar是否有任何包/方法可以幫助我確定一個是否是另一個的子目錄?我正在尋找跨平臺選項。
查看完整描述

3 回答

?
慕俠2389804

TA貢獻1719條經驗 獲得超6個贊

您可以嘗試使用path.filepath.Rel()

func Rel(basepath, targpath string) (string, error)

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。


查看完整回答
反對 回復 2021-09-10
?
子衿沉夜

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 路徑將需要額外檢查。


查看完整回答
反對 回復 2021-09-10
?
倚天杖

TA貢獻1828條經驗 獲得超3個贊

您可以使用函數path.filepath.Match()


匹配報告名稱是否與外殼文件名稱模式匹配。


例如:


pattern := "C:\foo\bar" + string(filepath.Separator) + "*"

matched, err := filepath.Match(pattern, "C:\foo\bar\baz")

matched應該在哪里true。


查看完整回答
反對 回復 2021-09-10
  • 3 回答
  • 0 關注
  • 373 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號