fast and minimal static site generator
ssg
at master 1.2 kB view raw
1package fileutil 2 3import ( 4 "fmt" 5 "io" 6 "os" 7 "path/filepath" 8) 9 10// CopyFile copies a file from src to dst. 11func CopyFile(src, dst string) error { 12 in, err := os.Open(src) 13 if err != nil { 14 return err 15 } 16 defer in.Close() 17 18 out, err := os.Create(dst) 19 if err != nil { 20 return err 21 } 22 defer out.Close() 23 24 _, err = io.Copy(out, in) 25 if err != nil { 26 return err 27 } 28 29 // Copy modes. 30 f, err := os.Stat(src) 31 if err == nil { 32 err = os.Chmod(dst, f.Mode()) 33 if err != nil { 34 return err 35 } 36 } 37 38 return out.Close() 39} 40 41// CopyDir copies an entire directory tree from 42// src to dst. 43func CopyDir(src, dst string) error { 44 fi, err := os.Stat(src) 45 if err != nil { 46 return err 47 } 48 49 if !fi.IsDir() { 50 return fmt.Errorf("error: %q is not a directory", fi) 51 } 52 53 if err = os.MkdirAll(dst, 0755); err != nil { 54 return err 55 } 56 57 items, _ := os.ReadDir(src) 58 for _, item := range items { 59 srcFilename := filepath.Join(src, item.Name()) 60 dstFilename := filepath.Join(dst, item.Name()) 61 if item.IsDir() { 62 if err := CopyDir(srcFilename, dstFilename); err != nil { 63 return err 64 } 65 } else { 66 if err := CopyFile(srcFilename, dstFilename); err != nil { 67 return err 68 } 69 } 70 } 71 72 return nil 73}