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  }