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

时间:2016-02-05 19:20:02

标签: go

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

1 个答案:

答案 0 :(得分:8)

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

解决方案1 ​​ - 学术

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

问题

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

    第一个是最简单的。 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
    }
    

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

    摘要

    第一个解决方案不如第二个解决方案准确,即使从纯粹的观点来看更正确。您应该选择的解决方案取决于您的需求。你喜欢误报还是假阴性?第一种解决方案可以给你误报,而第二种解决方案可以给你带来误报。