I have a directory:
basepath + /my/sub/directory
In that subdirectory, I have multiple instances of a file with name file.json
Example:
my/file.json
my/sub/file.json
my/sub/directory/file.json
What I want to do is use the full directory path and walk BACK up the file tree until I hit the basepath
and find all the filepaths for the file.json
I looked at filepath.Walk
but that seems to go downwards through the directory tree, not upwards
Here's one way you can walk backwards and read each file.json
along the way.
Example project directory structure:
./
- main.go
./my
- file.json > {"location": "/my"}
./my/sub
- file.json > {"location": "/my/sub"}
./my/sub/dir
- file.json > {"location": "/my/sub/dir"}
main.go
package main
import (
"fmt"
"io/ioutil"
"path/filepath"
)
func main() {
basePath := "./"
targetPath := basePath + "my/sub/dir"
fileName := "file.json"
for {
rel, _ := filepath.Rel(basePath, targetPath)
// Exit the loop once we reach the basePath.
if rel == "." {
break
}
// Simple file reading logic.
dat, err := ioutil.ReadFile(fmt.Sprintf("%v/%v", targetPath, fileName))
if err != nil {
panic(err)
}
fmt.Println(string(dat))
// Going up!
targetPath += "/.."
}
}
Output:
{ "location": "/my/sub/dir" }
{ "location": "/my/sub" }
{ "location": "/my" }
Hope you find this approach useful.