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 }