对于一个Golang开发者来说,牢固扎实的基础是十分重要的,编程网就来带大家一点点的掌握基础知识点。今天本篇文章带大家了解《在 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
}
到这里,我们也就讲完了《在 Go (Golang) 中查找文件系统对象》的内容了。个人认为,基础知识的学习和巩固,是为了更好的将其运用到项目中,欢迎关注编程网公众号,带你了解更多关于的知识点!