簡體   English   中英

在 Go (Golang) 中查找文件系統對象

[英]Find filesystem objects in Go (Golang)

我正在嘗試使用 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
    }
}

我意識到上面的代碼將允許將返回單個值的正則表達式解釋為目錄或文件而不是正則表達式。 出於我的目的,我可以放這張幻燈片,但只是好奇是否有人開發了一種更好的方法來采用可能包含正則表達式的路徑作為輸入並確定最后一個元素是否是正則表達式。

測試 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
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM