ioutil.go 893 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. package ioutil
  2. import (
  3. "io"
  4. "os"
  5. "github.com/cockroachdb/errors"
  6. )
  7. // CopyFile copies the file at src to dst, preserving file mode and
  8. // modification time.
  9. func CopyFile(src, dst string) error {
  10. si, err := os.Stat(src)
  11. if err != nil {
  12. return errors.Wrap(err, "stat source")
  13. }
  14. in, err := os.Open(src)
  15. if err != nil {
  16. return errors.Wrap(err, "open source")
  17. }
  18. defer in.Close()
  19. out, err := os.Create(dst)
  20. if err != nil {
  21. return errors.Wrap(err, "create target")
  22. }
  23. defer out.Close()
  24. if _, err = io.Copy(out, in); err != nil {
  25. return errors.Wrap(err, "copy")
  26. }
  27. if err = out.Sync(); err != nil {
  28. return errors.Wrap(err, "sync target")
  29. }
  30. if err = os.Chmod(dst, si.Mode()); err != nil {
  31. return errors.Wrap(err, "chmod target")
  32. }
  33. if err = os.Chtimes(dst, si.ModTime(), si.ModTime()); err != nil {
  34. return errors.Wrap(err, "chtimes target")
  35. }
  36. return nil
  37. }