Golang文件路径模块(https://golang.org/pkg/path/filepath/)包含一些用于操作路径的函数,os.Stat可用于检查文件是否存在.有没有办法检查一个字符串是否真的形成一个有效的路径(无论该路径上是否有文件)?
这个问题听起来很简单,但实际上并非如此.以下是我找到的两种可能的解决方案:
这里的想法是根据规则检查给定的文件路径.
操作系统
第一个是最简单的.Go为特定于操作系统的文件名/分隔符提供各种工具/ ...
os包中的示例:
const (
PathSeparator = '/' // OS-specific path separator
PathListSeparator = ':' // OS-specific path list separator
)
Run Code Online (Sandbox Code Playgroud)
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)]
}
Run Code Online (Sandbox Code Playgroud)
文件系统
文件系统有不同的限制.允许的最大长度或字符集可能会有所不同.不幸的是,你无法告诉(至少我不知道)你的路径将遍历哪个文件系统.
保留关键字
拥有给定操作系统的所有保留关键字的黑名单.
权衡是它不能保证100%文件路径有效.
尝试创建文件并立即删除它.
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
}
Run Code Online (Sandbox Code Playgroud)
该解决方案的主要优点是它简单明了,更准确.如果文件已存在或可以在给定路径上创建,则表示该文件有效.但是,由于访问受限,此解决方案还可能使有效路径无效.
第一个解决方案将不如第二个解决方案准确,即使从纯粹的观点来看更正确.您应该选择的解决方案取决于您的需求.你喜欢误报还是假阴性?第一种解决方案可以给你误报,而第二种解决方案可以给你带来误报.