github.com/khulnasoft-lab/tunnel-db@v0.0.0-20231117205118-74e1113bd007/pkg/utils/file.go (about) 1 package utils 2 3 import ( 4 "encoding/json" 5 "io" 6 "io/fs" 7 "log" 8 "os" 9 "path/filepath" 10 11 "golang.org/x/xerrors" 12 ) 13 14 func FileWalk(root string, walkFn func(r io.Reader, path string) error) error { 15 err := filepath.WalkDir(root, func(path string, d fs.DirEntry, err error) error { 16 if err != nil { 17 return err 18 } else if d.IsDir() { 19 return nil 20 } 21 22 info, err := d.Info() 23 if err != nil { 24 return xerrors.Errorf("file info error: %w", err) 25 } 26 27 if info.Size() == 0 { 28 log.Printf("invalid size: %s\n", path) 29 return nil 30 } 31 32 f, err := os.Open(path) 33 if err != nil { 34 return xerrors.Errorf("failed to open file: %w", err) 35 } 36 defer f.Close() 37 38 if err = walkFn(f, path); err != nil { 39 return err 40 } 41 return nil 42 }) 43 if err != nil { 44 return xerrors.Errorf("file walk error: %w", err) 45 } 46 return nil 47 } 48 49 func Exists(path string) (bool, error) { 50 _, err := os.Stat(path) 51 if err == nil { 52 return true, nil 53 } 54 if os.IsNotExist(err) { 55 return false, nil 56 } 57 return true, err 58 } 59 60 func UnmarshalJSONFile(v interface{}, fileName string) error { 61 f, err := os.Open(fileName) 62 if err != nil { 63 return xerrors.Errorf("unable to open a file (%s): %w", fileName, err) 64 } 65 defer f.Close() 66 67 if err = json.NewDecoder(f).Decode(v); err != nil { 68 return xerrors.Errorf("failed to decode file (%s): %w", fileName, err) 69 } 70 return nil 71 }