当前位置: 首页 > 面试题库 >

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

郑景胜
2023-03-14
问题内容

Golang文件路径模块(https://golang.org/pkg/path/filepath/)包含一些用于处理路径的函数,os.Stat可用于检查文件是否存在。有没有一种方法可以检查字符串是否真的构成了有效路径(无论该路径处是否有文件)?


问题答案:

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

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

问题

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

操作系统

第一个是最简单的。Go提供了各种工具,用于特定于OS的文件名/分隔符/ …

os包中的示例:

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

文件路径包中的另一个:

// 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
}

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

摘要

从纯粹的角度来看,第一种解决方案的准确性将不如第二种解决方案准确。您应该选择的解决方案取决于您的需求。您喜欢误报还是误报?第一个解决方案可以给您带来误报,而第二个解决方案则可以给您带来误报。



 类似资料:
  • 我在使用Jsoup解析器时遇到困难。如何判断给定的字符串是否是有效的HTML代码? isValid标记为true,因为JSoup首先使用HtmlTreeBuilder:如果仅有html、head或body标记丢失,它会自行添加它们。然后它使用Cleaner类,并根据给定的白名单进行检查。 有没有简单的方法可以检查字符串是否是有效的HTML,而不需要Jsoup尝试将其变成HTML? 我的例子是AJA

  • 本文向大家介绍检查字符串在Python中是否有效JSON,包括了检查字符串在Python中是否有效JSON的使用技巧和注意事项,需要的朋友参考一下 JSON是一种文本格式,用于在各种计算机程序之间轻松交换数据。它具有Python可以验证的特定格式。在本文中,我们将考虑一个字符串,并使用JSON模块验证该字符串是否表示有效的JSON格式。 创建JSON对象 json模块具有称为load的方法。它加载

  • 问题内容: 如何检查字符串是否为有效的UTF-8格式? 问题答案: 只能检查字节数据。如果您构造了一个String,则其内部已经存在于UTF-16中。 同样, 只有 字节数组可以使用UTF-8编码。 这是UTF-8转换的常见情况。 如果您不知道字节数组的编码,那么juniversalchardet是一个可以帮助您检测它的库。

  • 更新: 这是否意味着,如果我想检查一个特定的字符串是否是有效的日期时间,我需要一个巨大的格式数组??会有不同的组合,我相信。 即使有很多日期分隔符('.'、'/'、'-'等)根据区域性的不同,我很难定义要检查的格式数组。 基本上,我想检查一个特定的字符串是否至少包含日(1到31或01到31)、月(1到12或01到12)和年(yyyy或yy),以任何顺序,使用任何日期分隔符,解决方案是什么? 所以,

  • 问题内容: 我有一个isNotEmpty函数,如果字符串不为空,则返回true;如果字符串为空,则返回false。我发现如果我通过它传递一个空字符串,它将无法正常工作。 使用isNotEmpty验证字符串: 如果该字符串为空,则其他字符串将不会执行,我不明白为什么,请有人对此有所帮助。 问题答案: 实际上是简单的问题。更改: 至 可以说,您可能还想将其更改为: 因为如果您传递的是数字0以及其他一些

  • 如何检查给定的字符串是laravel中的有效时间戳。我想为它定义一个验证。输入字符串本身是一个时间戳,没有任何格式。例如"56123231"