我正在嘗試使用 Go 查找匹配的檔案系統物件并確定我作為輸入收到的路徑型別。具體來說,如果物件與提供的路徑匹配,我需要對它們執行操作。路徑的示例輸入可能如下所示:
/path/to/filename.ext
/path/to/dirname
/path/to/*.txt
我需要知道路徑是否存在,是檔案、目錄還是正則運算式,以便我可以相應地處理輸入。這是我迄今為止設計的解決方案:
func getPathType(path string) (bool, string, error) {
cpath := filepath.Clean(path)
l, err := filepath.Glob(cpath)
if err != nil {
return false, "", err
}
switch len(l) {
case 0:
return false, "", nil
case 1:
fsstat, fserr := os.Stat(cpath)
if fserr != nil {
return false, "", fserr
}
if fsstat.IsDir() {
return true, "dir", nil
}
return true, "file", nil
default:
return false, "regex", nil
}
}
我意識到上面的代碼將允許將回傳單個值的正則運算式解釋為目錄或檔案而不是正則運算式。出于我的目的,我可以放這張幻燈片,但只是好奇是否有人開發了一種更好的方法來將可能包含正則運算式的路徑作為輸入并確定最后一個元素是否是正則運算式。
uj5u.com熱心網友回復:
測驗 glob 特殊字符以確定路徑是否為 glob 模式。使用 filepath.Match 檢查有效的 glob 模式語法。
func getPathType(path string) (bool, string, error) {
cpath := filepath.Clean(path)
// Use Match to check glob syntax.
if _, err := filepath.Match(cpath, ""); err != nil {
return false, "", err
}
// If syntax is good and the path includes special
// glob characters, then it's a glob pattern.
special := `*?[`
if runtime.GOOS != "windows" {
special = `*?[\`
}
if strings.ContainsAny(cpath, special) {
return false, "regex", nil
}
fsstat, err := os.Stat(cpath)
if os.IsNotExist(err) {
return false, "", nil
} else if err != nil {
return false, "", err
}
if fsstat.IsDir() {
return true, "dir", nil
}
return true, "file", nil
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/334554.html
