github.com/jmigpin/editor@v1.6.0/util/iout/mkdirwritecopy.go (about) 1 package iout 2 3 import ( 4 "fmt" 5 "io" 6 "io/ioutil" 7 "os" 8 "path/filepath" 9 ) 10 11 var MkdirMode os.FileMode = 0770 12 13 func MkdirAll(filename string) error { 14 return os.MkdirAll(filename, MkdirMode) 15 } 16 17 func MkdirAllWriteFile(filename string, src []byte, m os.FileMode) error { 18 if err := MkdirAll(filepath.Dir(filename)); err != nil { 19 return err 20 } 21 return ioutil.WriteFile(filename, []byte(src), m) 22 } 23 24 func MkdirAllCopyFile(src, dst string, m os.FileMode) error { 25 if err := MkdirAll(filepath.Dir(dst)); err != nil { 26 return err 27 } 28 return CopyFile(src, dst, m) 29 } 30 31 func CopyFile(src, dst string, m os.FileMode) error { 32 from, err := os.Open(src) 33 if err != nil { 34 return err 35 } 36 defer from.Close() 37 flags := os.O_RDWR | os.O_CREATE | os.O_TRUNC 38 to, err := os.OpenFile(dst, flags, m) 39 if err != nil { 40 return err 41 } 42 defer to.Close() 43 _, err = io.Copy(to, from) 44 return err 45 } 46 47 func MkdirAllCopyFileSync(src, dst string, m os.FileMode) error { 48 // must exist in src 49 info1, err := os.Stat(src) 50 if os.IsNotExist(err) { 51 return fmt.Errorf("src not found: %v", src) 52 } 53 54 // already exists in dest with same modification time 55 info2, err := os.Stat(dst) 56 if !os.IsNotExist(err) { 57 // compare modification time in src 58 if info2.ModTime().Equal(info1.ModTime()) { 59 return nil 60 } 61 } 62 63 if err := MkdirAllCopyFile(src, dst, m); err != nil { 64 return err 65 } 66 67 // set modtime equal to src to avoid copy next time 68 t := info1.ModTime().Local() 69 return os.Chtimes(dst, t, t) 70 }