github.com/pavlo67/common@v0.5.3/common/filelib/files.go (about) 1 package filelib 2 3 import ( 4 "fmt" 5 "io" 6 "io/fs" 7 "os" 8 "path" 9 "path/filepath" 10 "regexp" 11 "runtime" 12 "strings" 13 "time" 14 15 "github.com/pkg/errors" 16 ) 17 18 func CurrentFile(removeExt bool) string { 19 if _, filename, _, ok := runtime.Caller(1); ok { 20 if removeExt { 21 filenamePOSIX := reBackslash.ReplaceAllString(filename, "/") 22 partes := strings.Split(filenamePOSIX, "/") 23 if len(partes) < 1 { 24 return "" 25 } 26 partes[len(partes)-1] = reExt.ReplaceAllString(partes[len(partes)-1], "") 27 return strings.Join(partes, "/") 28 } 29 return filename 30 } 31 return "" 32 } 33 34 func CorrectFileName(name string) string { 35 name = rePoint.ReplaceAllLiteralString(name, "_") 36 name = reSpecials.ReplaceAllLiteralString(name, "_") 37 return name 38 } 39 40 const onCopyFiles = "on filelib.CopyFiles()" 41 42 func CopyFiles(path, targetPath string, reStr string, removeOrigin bool) error { 43 re, err := regexp.Compile(reStr) 44 if err != nil { 45 return fmt.Errorf("wrong reStr: '%s'"+onCopyFiles, reStr) 46 } 47 48 targetPath, err = Dir(targetPath) 49 if err != nil { 50 return fmt.Errorf("targetPath is wrong: %s / "+onCopyFiles, err) 51 } 52 53 dirEntries, err := List(path, re, false, true) 54 if err != nil { 55 return fmt.Errorf("%s / "+onCopyFiles, err) 56 } 57 58 for _, dirEntry := range dirEntries { 59 if removeOrigin { 60 err = os.Rename(dirEntry, filepath.Join(targetPath, filepath.Base(dirEntry))) 61 } else { 62 err = CopyFile(dirEntry, filepath.Join(targetPath, filepath.Base(dirEntry))) 63 } 64 65 if err != nil { 66 return fmt.Errorf("%s / "+onCopyFiles, err) 67 } 68 69 } 70 71 return nil 72 } 73 74 func BackupFile(fileName string) error { 75 dir := path.Dir(fileName) + "/" 76 77 backupName := dir + path.Base(fileName) + "." + time.Now().Format(time.RFC3339)[:10] + ".bak" 78 79 _, err := os.Stat(backupName) 80 81 if err == nil { 82 return nil 83 } 84 85 if os.IsNotExist(err) { 86 err = CopyFile(fileName, backupName) 87 return errors.Wrapf(err, "on copying '%s' to '%s'", fileName, backupName) 88 } 89 90 return errors.Wrapf(err, "on copying '%s' to '%s'", fileName, backupName) 91 } 92 93 type Convert func(data []byte) ([]byte, error) 94 95 func CopyFileConverted(src, dst string, perm fs.FileMode, convert Convert) error { 96 // TODO??? check if src and dst are the same 97 98 data, err := os.ReadFile(src) 99 if err != nil { 100 return err 101 } 102 103 if convert != nil { 104 data, err = convert(data) 105 if err != nil { 106 return err 107 } 108 } 109 110 return os.WriteFile(dst, data, perm) 111 } 112 113 //func CopyFile(src, dst string) error { 114 // // TODO??? check if src and dst are the same 115 // 116 // in, err := os.Open(src) 117 // if err != nil { 118 // return err 119 // } 120 // defer func() { 121 // if err := in.Close(); err != nil { 122 // fmt.Fprintf(os.Stderr, "error closing %s: %s", src, err) 123 // } 124 // }() 125 // 126 // out, err := os.Create(dst) 127 // if err != nil { 128 // return err 129 // } 130 // defer func() { 131 // if err := out.Close(); err != nil { 132 // fmt.Fprintf(os.Stderr, "error closing %s: %s", dst, err) 133 // } 134 // }() 135 // 136 // if _, err = io.Copy(out, in); err != nil { 137 // return err 138 // } 139 // 140 // return out.Sync() 141 //} 142 143 //type Convert func(data []byte) ([]byte, error) 144 // 145 //func CopyFileConverted(src, dst string, perm fs.FileMode, convert Convert) error { 146 // // TODO??? check if src and dst are the same 147 // 148 // data, err := os.ReadFile(src) 149 // if err != nil { 150 // return err 151 // } 152 // 153 // if convert != nil { 154 // data, err = convert(data) 155 // if err != nil { 156 // return err 157 // } 158 // } 159 // 160 // return os.WriteFile(dst, data, perm) 161 //} 162 163 func CopyFile(src, dst string) error { 164 // TODO??? check if src and dst are the same 165 166 in, err := os.Open(src) 167 if err != nil { 168 return err 169 } 170 defer func() { 171 if err := in.Close(); err != nil { 172 fmt.Fprintf(os.Stderr, "error closing %s: %s", src, err) 173 } 174 }() 175 176 out, err := os.Create(dst) 177 if err != nil { 178 return err 179 } 180 defer func() { 181 if err := out.Close(); err != nil { 182 fmt.Fprintf(os.Stderr, "error closing %s: %s", dst, err) 183 } 184 }() 185 186 if _, err = io.Copy(out, in); err != nil { 187 return err 188 } 189 190 return out.Sync() 191 } 192 193 func RemoveContents(dir string) error { 194 //d, err := os.Open(dir) 195 //if err != nil { 196 // return err 197 //} 198 //defer d.Close() 199 //names, err := d.Readdirnames(-1) 200 //if err != nil { 201 // return err 202 //} 203 204 files, err := os.ReadDir(dir) 205 if err != nil { 206 return err 207 } 208 209 for _, file := range files { 210 if err = os.RemoveAll(filepath.Join(dir, file.Name())); err != nil { 211 return err 212 } 213 } 214 return nil 215 } 216 217 const onRemoveFile = "on filelib.RemoveFile()" 218 219 func RemoveFile(path string) error { 220 if fileExists, _ := FileExistsAny(path); fileExists { 221 if err := os.Remove(path); err != nil { 222 return errors.Wrap(err, onRemoveFile) 223 } 224 } 225 return nil 226 }