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

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

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

Go
守着星空守着你 2021-12-07 18:48:47
Golang 文件路径模块 ( https://golang.org/pkg/path/filepath/ ) 包含一些用于操作路径的函数,os.Stat可用于检查文件是否存在。有没有办法检查一个字符串是否真的形成了一个有效的路径(不管那个路径上是否有一个文件)?
查看完整描述

1 回答

?
忽然笑

TA贡献1806条经验 获得超5个赞

这个问题听起来很简单,但实际上并非如此。这是我发现的两种可能的解决方案:

解决方案 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

}

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


概括

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


查看完整回答
反对 回复 2021-12-07
  • 1 回答
  • 0 关注
  • 260 浏览
慕课专栏
更多

添加回答

举报

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