File 确定路径是否位于Go中的另一条路径内
我想删除一个文件的所有路径组件,最多(但不包括)一个总的基本目录 例如: /总体/basedir/a/b/c/file 我想删除“文件”,然后删除“c”,“b”和“a”,如果可能的话(目录不是空的)。我不想取消“basedir”或“总体”的链接 filepath.HasPrefix似乎是一个不错的选择,但它显然已被弃用: 我现在得到的是:File 确定路径是否位于Go中的另一条路径内,file,go,path,File,Go,Path,我想删除一个文件的所有路径组件,最多(但不包括)一个总的基本目录 例如: /总体/basedir/a/b/c/file 我想删除“文件”,然后删除“c”,“b”和“a”,如果可能的话(目录不是空的)。我不想取消“basedir”或“总体”的链接 filepath.HasPrefix似乎是一个不错的选择,但它显然已被弃用: 我现在得到的是: p := THEPATH // attempt to remove file and all parent directories up to the ba
p := THEPATH
// attempt to remove file and all parent directories up to the basedir
// FIXME: HasPrefix is apparently bad.. a better idea?
for filepath.HasPrefix(p, baseDir) {
err := os.Remove(p)
if err != nil {
break
}
// climb up one
p = filepath.Dir(p)
}
寻找一种在所有Go支持的平台上运行的简洁可靠的方法。IMHO,如果您想支持
golang
支持的所有平台,路径处理相当复杂。Bellow是到目前为止我已经实现的解决方案(可能不是最简单的一个)。注:
os.Remove
visitedpath
切片中。然后,如果没有发生错误,则对每个候选路径执行操作
basePath
下的文件和父目录,可以执行以下操作:
func remove(pathName, basePath string) {
act := func(p pathwalker.PathInfo) error {
if p.FileInfo.IsDir() {
fmt.Printf(" Removing directory=%s\n", p.FullPath)
return os.Remove(p.FullPath)
}
fmt.Printf(" Removing file=%s\n", p.FullPath)
return os.Remove(p.FullPath)
}
pw := pathwalker.NewPathWalker(pathName, basePath)
n, err := pw.Walk(act)
fmt.Printf("Removed: %d/%d, err=%v\n", n, len(pw.VisitedPaths()), err)
}
n, err := pathwalker.NewPathWalker(fileName, basePath).Walk(nil)
if n > 0 && err != nil {
//is inside another path
}
如果只想测试一条路径是否位于另一条路径内,可以执行以下操作:
func remove(pathName, basePath string) {
act := func(p pathwalker.PathInfo) error {
if p.FileInfo.IsDir() {
fmt.Printf(" Removing directory=%s\n", p.FullPath)
return os.Remove(p.FullPath)
}
fmt.Printf(" Removing file=%s\n", p.FullPath)
return os.Remove(p.FullPath)
}
pw := pathwalker.NewPathWalker(pathName, basePath)
n, err := pw.Walk(act)
fmt.Printf("Removed: %d/%d, err=%v\n", n, len(pw.VisitedPaths()), err)
}
n, err := pathwalker.NewPathWalker(fileName, basePath).Walk(nil)
if n > 0 && err != nil {
//is inside another path
}
SameFile似乎正是我要找的!谢谢你的工作代码-我不确定我需要这么复杂的东西,但这看起来是一个不错的方法。