1 回答
TA贡献1806条经验 获得超5个赞
这个问题听起来很简单,但实际上并非如此。这是我发现的两种可能的解决方案:
解决方案 1 - 学术
这里的想法是根据规则检查给定的文件路径。
问题
操作系统(UNIX/Windows)
文件系统
保留关键字
操作系统
第一个是最简单的。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
}
此解决方案的主要优点是它简单明了且更准确。如果文件已经存在或可以在给定路径创建,则表示它是有效的。但是,由于访问受限,此解决方案也可能使有效路径无效。
概括
尽管从纯粹的角度来看更正确,但第一个解决方案的准确度将低于第二个。您应该选择的解决方案取决于您的需要。你更喜欢假阳性还是假阴性?第一个解决方案可能会给您误报,而第二个解决方案可能会给您误报。
- 1 回答
- 0 关注
- 260 浏览
添加回答
举报