为了账号安全,请及时绑定邮箱和手机立即绑定

在 Go (Golang) 中查找文件系统对象

在 Go (Golang) 中查找文件系统对象

Go
慕码人8056858 2022-10-10 15:36:36
我正在尝试使用 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 回答

?
慕容3067478

TA贡献1773条经验 获得超3个赞

测试 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

}



查看完整回答
反对 回复 2022-10-10
  • 1 回答
  • 0 关注
  • 94 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信