func someCaller () error { err := CopyFile(src, dst) if err != nil { return fmt.Errorf("copy file failed: %s %s: %v", src, dst, err) } } func CopyFile(src, dst string) error { r, err := os.Open(src) if err != nil { return fmt.Errorf("failed to open source file: %s", err) } defer r.Close() w, err := os.Create(dst) if err != nil { return fmt.Errorf("failed to open dest file: %s", err) } if _, err := io.Copy(w, r); err != nil { w.Close() os.Remove(dst) return fmt.Errorf("copy interrupted: %s", err) } if err := w.Close(); err != nil { os.Remove(dst) return fmt.Errorf("could not close dest: %s", err) } }