package sync import ( "io" "os" "path/filepath" "time" ) // CopyFile copies the file at src to dest, creating any missing parent // directories. After a successful write the destination mtime is set to // srcModTime so that subsequent sync passes do not treat the file as changed. func CopyFile(src, dest string, srcModTime time.Time) error { if err := os.MkdirAll(filepath.Dir(dest), 0o755); err != nil { return err } in, err := os.Open(src) if err != nil { return err } defer in.Close() out, err := os.Create(dest) if err != nil { return err } if _, err := io.Copy(out, in); err != nil { out.Close() return err } if err := out.Close(); err != nil { return err } return os.Chtimes(dest, srcModTime, srcModTime) }