在 Go (Golang) 中查找文件系统对象
Posted
技术标签:
【中文标题】在 Go (Golang) 中查找文件系统对象【英文标题】:Find filesystem objects in Go (Golang) 【发布时间】:2021-12-08 15:33:08 【问题描述】:我正在尝试使用 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
我意识到上面的代码允许将返回单个值的正则表达式解释为目录或文件,而不是正则表达式。出于我的目的,我可以放开这张幻灯片,但只是好奇是否有人开发了一种更好的方法来获取可能包含正则表达式作为输入的路径并确定最后一个元素是否是正则表达式。
【问题讨论】:
【参考方案1】:测试 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
【讨论】:
这很酷。在查找特殊字符之前,我什至没有考虑先通过 filepath.Match 运行路径来测试正则表达式的有效性。我一直在搞乱 regexp.Compile 但 filepath.Match 只关注对路径/文件名而言重要的字符。感谢您的回复。不错的解决方案以上是关于在 Go (Golang) 中查找文件系统对象的主要内容,如果未能解决你的问题,请参考以下文章