PackageManager just because
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

129 lines
2.0 KiB

  1. package Archive
  2. import (
  3. "archive/tar"
  4. "compress/gzip"
  5. "io"
  6. "os"
  7. "path/filepath"
  8. "strings"
  9. )
  10. func Gzip(source, target string) error {
  11. var (
  12. reader, writer *os.File
  13. archiver *gzip.Writer
  14. filename string
  15. e error
  16. )
  17. reader, e = os.Open(source)
  18. if e != nil {
  19. return e
  20. }
  21. //filename = filepath.Base(source)
  22. //target = filepath.Join(target, fmt.Sprintf("%s.gz", filename))
  23. writer, e = os.Create(target)
  24. if e != nil {
  25. return e
  26. }
  27. defer writer.Close()
  28. archiver = gzip.NewWriter(writer)
  29. archiver.Name = filename
  30. defer archiver.Close()
  31. _, e = io.Copy(archiver, reader)
  32. return e
  33. }
  34. func Tar(source, target string) error {
  35. var (
  36. tarfile, file *os.File
  37. tarball *tar.Writer
  38. info os.FileInfo
  39. header *tar.Header
  40. e error
  41. )
  42. tarfile, e = os.Create(target)
  43. if e != nil {
  44. return e
  45. }
  46. defer tarfile.Close()
  47. tarball = tar.NewWriter(tarfile)
  48. defer tarball.Close()
  49. info, e = os.Stat(source)
  50. if e != nil {
  51. return e
  52. }
  53. var baseDir string
  54. if info.IsDir() {
  55. baseDir = filepath.Base(source)
  56. }
  57. return filepath.Walk(source,
  58. func(path string, info os.FileInfo, e error) error {
  59. if e != nil {
  60. return e
  61. }
  62. header, e = tar.FileInfoHeader(info, info.Name())
  63. if e != nil {
  64. return e
  65. }
  66. if baseDir != "" {
  67. header.Name = filepath.Join(
  68. baseDir,
  69. strings.TrimPrefix(
  70. strings.Join(strings.Split(path, "/")[1:], "/"),
  71. source,
  72. ),
  73. )
  74. }
  75. e = tarball.WriteHeader(header)
  76. if e != nil {
  77. return e
  78. }
  79. if info.IsDir() {
  80. return nil
  81. }
  82. file, e = os.Open(path)
  83. if e != nil {
  84. return e
  85. }
  86. defer file.Close()
  87. _, e = io.Copy(tarball, file)
  88. return e
  89. })
  90. }
  91. func TarGzip(source, target string) error {
  92. var (
  93. tarPath string = strings.ReplaceAll(target, ".gz", "")
  94. e error
  95. )
  96. e = Tar(source, tarPath)
  97. if e != nil {
  98. return e
  99. }
  100. e = Gzip(tarPath, target)
  101. if e != nil {
  102. return e
  103. }
  104. return os.Remove(tarPath)
  105. }