fileutils.go 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. package fileutils // import "github.com/docker/docker/pkg/fileutils"
  2. import (
  3. "fmt"
  4. "io"
  5. "os"
  6. "path/filepath"
  7. )
  8. // CopyFile copies from src to dst until either EOF is reached
  9. // on src or an error occurs. It verifies src exists and removes
  10. // the dst if it exists.
  11. func CopyFile(src, dst string) (int64, error) {
  12. cleanSrc := filepath.Clean(src)
  13. cleanDst := filepath.Clean(dst)
  14. if cleanSrc == cleanDst {
  15. return 0, nil
  16. }
  17. sf, err := os.Open(cleanSrc)
  18. if err != nil {
  19. return 0, err
  20. }
  21. defer sf.Close()
  22. if err := os.Remove(cleanDst); err != nil && !os.IsNotExist(err) {
  23. return 0, err
  24. }
  25. df, err := os.Create(cleanDst)
  26. if err != nil {
  27. return 0, err
  28. }
  29. defer df.Close()
  30. return io.Copy(df, sf)
  31. }
  32. // ReadSymlinkedDirectory returns the target directory of a symlink.
  33. // The target of the symbolic link may not be a file.
  34. func ReadSymlinkedDirectory(path string) (string, error) {
  35. var realPath string
  36. var err error
  37. if realPath, err = filepath.Abs(path); err != nil {
  38. return "", fmt.Errorf("unable to get absolute path for %s: %s", path, err)
  39. }
  40. if realPath, err = filepath.EvalSymlinks(realPath); err != nil {
  41. return "", fmt.Errorf("failed to canonicalise path for %s: %s", path, err)
  42. }
  43. realPathInfo, err := os.Stat(realPath)
  44. if err != nil {
  45. return "", fmt.Errorf("failed to stat target '%s' of '%s': %s", realPath, path, err)
  46. }
  47. if !realPathInfo.Mode().IsDir() {
  48. return "", fmt.Errorf("canonical path points to a file '%s'", realPath)
  49. }
  50. return realPath, nil
  51. }
  52. // CreateIfNotExists creates a file or a directory only if it does not already exist.
  53. func CreateIfNotExists(path string, isDir bool) error {
  54. if _, err := os.Stat(path); err != nil {
  55. if os.IsNotExist(err) {
  56. if isDir {
  57. return os.MkdirAll(path, 0755)
  58. }
  59. if err := os.MkdirAll(filepath.Dir(path), 0755); err != nil {
  60. return err
  61. }
  62. f, err := os.OpenFile(path, os.O_CREATE, 0755)
  63. if err != nil {
  64. return err
  65. }
  66. f.Close()
  67. }
  68. }
  69. return nil
  70. }