Golang检查字符串是否是有效路径

标签 go

Golang 文件路径模块 (https://golang.org/pkg/path/filepath/) 包含一些用于操作路径的函数,os.Stat 可用于检查文件是否存在。有没有办法检查一个字符串是否真的形成了一个有效的路径(不管该路径是否有文件)?

最佳答案

这个问题听起来很简单,其实不然。这是我发现的两种可能的解决方案:

解决方案 1 - 学术

这里的想法是根据规则检查给定的文件路径。

问题

  1. 操作系统(UNIX/Windows)
  2. 文件系统
  3. 保留关键字

操作系统

第一个是最简单的。 Go 为特定于操作系统的文件名/分隔符/...提供了各种工具。

os 中的示例包装:

const (
    PathSeparator     = '/' // OS-specific path separator
    PathListSeparator = ':' // OS-specific path list separator
)

filepath 中的另一个包装:

// VolumeName returns leading volume name.
// Given "C:\foo\bar" it returns "C:" on Windows.
// Given "\\host\share\foo" it returns "\\host\share".
// On other platforms it returns "".
func VolumeName(path string) string {
    return path[:volumeNameLen(path)]
}

文件系统

文件系统有不同的限制。允许的最大长度或字符集可能会有所不同。不幸的是,您无法确定(至少据我所知)您的路径将遍历哪个文件系统。

保留关键字

拥有给定操作系统的所有保留关键字的黑名单。

实现

对于这个解决方案,我会构建一个 lexer/parser .

权衡是它不能保证文件路径 100% 有效。

解决方案 2 - 经验

尝试创建文件并在之后立即将其删除。

func IsValid(fp string) bool {
  // Check if file already exists
  if _, err := os.Stat(fp); err == nil {
    return true
  }

  // Attempt to create it
  var d []byte
  if err := ioutil.WriteFile(fp, d, 0644); err == nil {
    os.Remove(fp) // And delete it
    return true
  }

  return false
}

此解决方案的主要好处是简单且更准确。如果文件已经存在或可以在给定路径创建,则表示它是有效的。但是,由于访问受限,此解决方案也可能使有效路径无效。

总结

第一个解决方案不如第二个解决方案准确,尽管从纯粹的角度来看更正确。您应该选择的解决方案取决于您的需要。你更喜欢误报还是误报?第一个解决方案可能会给您带来误报,而第二个解决方案可能会给您带来误报。

关于Golang检查字符串是否是有效路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35231846/

相关文章:

go - 我如何解码 Dynamic Viper 或 JSON 键作为结构字段的一部分

go - 如何在 golang 的 RESTful api 中维护应用程序状态

Golang 字符串格式给出了意想不到的间距

go - 如何使用Google云端硬盘API(v3)获取目录中所有文件的列表

dictionary - 遍历包含不同级别 map 的界面 map

go - 闭包、匿名函数和普通函数的基准

google-app-engine - 获取 Channel API 客户端脚本时出现 CORS 相关错误

go - 编写模块?

go - 使用 goavro 处理多种类型的解码数据

string - 从字符串到结构 Golang