github.com/scottcagno/storage@v1.8.0/pkg/util/ioutil.go (about)

     1  package util
     2  
     3  import (
     4  	"fmt"
     5  	"io"
     6  	"io/fs"
     7  	"io/ioutil"
     8  	"log"
     9  	"os"
    10  	"path/filepath"
    11  	"time"
    12  )
    13  
    14  func OpenTempFile(dir, file string) *os.File {
    15  	f, err := ioutil.TempFile(dir, file)
    16  	if err != nil {
    17  		log.Panicf("opening temp file: %v", err)
    18  		return nil
    19  	}
    20  	return f
    21  }
    22  
    23  func MkDir(name string) string {
    24  	d, err := ioutil.TempDir("", name)
    25  	if err != nil {
    26  		log.Panicf("creating temp dir: %v", err)
    27  	}
    28  	return d
    29  }
    30  
    31  func WriteData(fd *os.File, data []byte) {
    32  	fd.Seek(0, 0)
    33  	if _, err := fd.Write(data); err != nil {
    34  		log.Panicf("writing: %v", err)
    35  	}
    36  }
    37  
    38  func ReadData(fd *os.File, data []byte) {
    39  	fd.Seek(0, 0)
    40  	if _, err := fd.Read(data); err != nil {
    41  		log.Panicf("reading: %v", err)
    42  	}
    43  }
    44  
    45  func CreateFile(path string) error {
    46  	_, err := os.Stat(path)
    47  	if os.IsNotExist(err) {
    48  		dir, file := filepath.Split(path)
    49  		err = os.MkdirAll(dir, os.ModeDir)
    50  		if err != nil {
    51  			return err
    52  		}
    53  		fd, err := os.Create(dir + file)
    54  		if err != nil {
    55  			return err
    56  		}
    57  		err = fd.Close()
    58  		if err != nil {
    59  			return err
    60  		}
    61  	}
    62  	return nil
    63  }
    64  
    65  func CreateFileSize(path string, size int64) error {
    66  	_, err := os.Stat(path)
    67  	if os.IsNotExist(err) {
    68  		dir, file := filepath.Split(path)
    69  		err = os.MkdirAll(dir, os.ModeDir)
    70  		if err != nil {
    71  			return err
    72  		}
    73  		fd, err := os.Create(dir + file)
    74  		if err != nil {
    75  			return err
    76  		}
    77  		err = fd.Truncate(size)
    78  		if err != nil {
    79  			return err
    80  		}
    81  		err = fd.Close()
    82  		if err != nil {
    83  			return err
    84  		}
    85  	}
    86  	return nil
    87  }
    88  
    89  func TruncateFile(fd *os.File, size int64) error {
    90  	err := fd.Truncate(size)
    91  	if err != nil {
    92  		return err
    93  	}
    94  	return nil
    95  }
    96  
    97  func CleanPath(path string) (string, string) {
    98  	path, err := filepath.Abs(path)
    99  	if err != nil {
   100  		log.Panicf("cleaning path: %v\n", err)
   101  	}
   102  	return filepath.Split(filepath.ToSlash(path))
   103  }
   104  
   105  func OpenFile(path string) (*os.File, error) {
   106  	_, err := os.Stat(path)
   107  	if os.IsNotExist(err) {
   108  		dir, file := filepath.Split(path)
   109  		err = os.MkdirAll(dir, os.ModeDir)
   110  		if err != nil {
   111  			return nil, err
   112  		}
   113  		fd, err := os.Create(dir + file)
   114  		if err != nil {
   115  			return nil, err
   116  		}
   117  		err = fd.Close()
   118  		if err != nil {
   119  			return fd, err
   120  		}
   121  	}
   122  	fd, err := os.OpenFile(path, os.O_RDWR, 0666) // os.ModeSticky
   123  	if err != nil {
   124  		return nil, err
   125  	}
   126  	return fd, nil
   127  }
   128  
   129  func ListDir(path string) error {
   130  	files, err := os.ReadDir(path)
   131  	if err != nil {
   132  		return err
   133  	}
   134  	for _, file := range files {
   135  		fmt.Println(file.Name())
   136  	}
   137  	return nil
   138  }
   139  
   140  func WalkDir(path string) error {
   141  	root := path
   142  	fileSystem := os.DirFS(root)
   143  	fn := func(p string, d fs.DirEntry, err error) error {
   144  		if err != nil {
   145  			return err
   146  		}
   147  		return nil
   148  	}
   149  	return fs.WalkDir(fileSystem, ".", fn)
   150  }
   151  
   152  func WatchFile(path string) error {
   153  	path, err := filepath.Abs(path)
   154  	if err != nil {
   155  		return err
   156  	}
   157  	initialStat, err := os.Stat(path)
   158  	if err != nil {
   159  		return err
   160  	}
   161  	for {
   162  		stat, err := os.Stat(path)
   163  		if err != nil {
   164  			return err
   165  		}
   166  		if stat.Size() != initialStat.Size() || stat.ModTime() != initialStat.ModTime() {
   167  			break
   168  		}
   169  		time.Sleep(3 * time.Second) // poll rate
   170  	}
   171  	return nil
   172  }
   173  
   174  func NewFileWatch(path string) {
   175  	done := make(chan bool)
   176  	go func(done chan bool) {
   177  		defer func() {
   178  			done <- true
   179  		}()
   180  		err := WatchFile(path)
   181  		if err != nil {
   182  			fmt.Println(err)
   183  		}
   184  		fmt.Println("File has been changed")
   185  	}(done)
   186  	<-done
   187  }
   188  
   189  func FilePointerOffset(fd *os.File) int64 {
   190  	pos, err := fd.Seek(0, io.SeekCurrent)
   191  	if err != nil {
   192  		log.Printf("error with file pointer offset: %v\n", err)
   193  		return -1
   194  	}
   195  	return pos
   196  }