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.

111 lines
1.6 KiB

  1. package Archive
  2. import (
  3. "archive/tar"
  4. "compress/gzip"
  5. "io"
  6. "io/fs"
  7. "os"
  8. "path/filepath"
  9. "strings"
  10. )
  11. func UnGzip(source, target string) error {
  12. var (
  13. reader, writer *os.File
  14. archive *gzip.Reader
  15. e error
  16. )
  17. reader, e = os.Open(source)
  18. if e != nil {
  19. return e
  20. }
  21. defer reader.Close()
  22. archive, e = gzip.NewReader(reader)
  23. if e != nil {
  24. return e
  25. }
  26. defer archive.Close()
  27. target = filepath.Join(target, archive.Name)
  28. writer, e = os.Create(target)
  29. if e != nil {
  30. return e
  31. }
  32. defer writer.Close()
  33. _, e = io.Copy(writer, archive)
  34. return e
  35. }
  36. func Untar(tarball, target string) error {
  37. var (
  38. reader *os.File
  39. tarReader *tar.Reader
  40. header *tar.Header
  41. info fs.FileInfo
  42. file *os.File
  43. path string
  44. e error
  45. )
  46. reader, e = os.Open(tarball)
  47. if e != nil {
  48. return e
  49. }
  50. defer reader.Close()
  51. tarReader = tar.NewReader(reader)
  52. for {
  53. header, e = tarReader.Next()
  54. if e == io.EOF {
  55. break
  56. }
  57. if e != nil {
  58. return e
  59. }
  60. path = "/" + strings.Join(strings.Split(header.Name, "/")[1:], "/")
  61. info = header.FileInfo()
  62. if info.IsDir() {
  63. e = os.MkdirAll(path, info.Mode())
  64. if e != nil {
  65. return e
  66. }
  67. continue
  68. }
  69. file, e = os.OpenFile(path, os.O_CREATE|os.O_TRUNC|os.O_WRONLY, info.Mode())
  70. if e != nil {
  71. return e
  72. }
  73. defer file.Close()
  74. _, e = io.Copy(file, tarReader)
  75. if e != nil {
  76. return e
  77. }
  78. }
  79. return nil
  80. }
  81. func UntarGzip(source, target string) error {
  82. var (
  83. tarPath string = strings.ReplaceAll(source, ".gz", "")
  84. e error
  85. )
  86. e = UnGzip(source, tarPath)
  87. if e != nil {
  88. return e
  89. }
  90. return Untar(tarPath, target)
  91. }