File 确定路径是否位于Go中的另一条路径内

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

我想删除一个文件的所有路径组件,最多(但不包括)一个总的基本目录

例如: /总体/basedir/a/b/c/file

我想删除“文件”,然后删除“c”,“b”和“a”,如果可能的话(目录不是空的)。我不想取消“basedir”或“总体”的链接

filepath.HasPrefix似乎是一个不错的选择,但它显然已被弃用:

我现在得到的是:

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似乎正是我要找的!谢谢你的工作代码-我不确定我需要这么复杂的东西,但这看起来是一个不错的方法。