|
5 | 5 | "bytes"
|
6 | 6 | "fmt"
|
7 | 7 | "os"
|
8 |
| - "path" |
9 | 8 | "path/filepath"
|
10 | 9 | "strings"
|
11 | 10 |
|
@@ -94,40 +93,67 @@ func ParentBaseDir(p string) string {
|
94 | 93 | func CompressDir(dir string) error {
|
95 | 94 | files, err := os.ReadDir(dir)
|
96 | 95 | if err != nil {
|
97 |
| - return err |
| 96 | + return fmt.Errorf("read dir error: %w", err) |
98 | 97 | }
|
99 |
| - b := new(bytes.Buffer) |
100 |
| - zw := zip.NewWriter(b) |
101 |
| - for _, f := range files { |
102 |
| - fw, err := zw.Create(f.Name()) |
103 |
| - if err != nil { |
104 |
| - return err |
105 |
| - } |
106 |
| - name := path.Join(dir, f.Name()) |
107 |
| - content, err := os.ReadFile(name) |
108 |
| - if err != nil { |
109 |
| - return err |
110 |
| - } |
111 |
| - _, err = fw.Write(content) |
112 |
| - if err != nil { |
113 |
| - return err |
114 |
| - } |
115 |
| - err = os.Remove(name) |
116 |
| - if err != nil { |
117 |
| - return err |
| 98 | + if len(files) == 0 { |
| 99 | + // Return an error if no files are found in the directory |
| 100 | + return fmt.Errorf("no files to compress in: %s", dir) |
| 101 | + } |
| 102 | + |
| 103 | + buffer := new(bytes.Buffer) |
| 104 | + zipWriter := zip.NewWriter(buffer) |
| 105 | + defer func() { |
| 106 | + _ = zipWriter.Close() |
| 107 | + }() |
| 108 | + |
| 109 | + for _, file := range files { |
| 110 | + if err := addFileToZip(zipWriter, filepath.Join(dir, file.Name())); err != nil { |
| 111 | + return fmt.Errorf("failed to add file to zip: %w", err) |
118 | 112 | }
|
119 | 113 | }
|
120 |
| - if err := zw.Close(); err != nil { |
121 |
| - return err |
| 114 | + |
| 115 | + if err := zipWriter.Close(); err != nil { |
| 116 | + return fmt.Errorf("error closing zip writer: %w", err) |
122 | 117 | }
|
123 |
| - filename := filepath.Join(dir, fmt.Sprintf("%s.zip", dir)) |
124 |
| - outFile, err := os.Create(filepath.Clean(filename)) |
| 118 | + |
| 119 | + zipFilename := filepath.Join(dir, filepath.Base(dir)+".zip") |
| 120 | + return writeFile(buffer, zipFilename) |
| 121 | +} |
| 122 | + |
| 123 | +func addFileToZip(zw *zip.Writer, filename string) error { |
| 124 | + content, err := os.ReadFile(filename) |
125 | 125 | if err != nil {
|
126 |
| - return err |
| 126 | + return fmt.Errorf("error reading file %s: %w", filename, err) |
127 | 127 | }
|
128 |
| - _, err = b.WriteTo(outFile) |
| 128 | + |
| 129 | + fw, err := zw.Create(filepath.Base(filename)) |
129 | 130 | if err != nil {
|
130 |
| - return err |
| 131 | + return fmt.Errorf("error creating zip entry for %s: %w", filename, err) |
131 | 132 | }
|
132 |
| - return outFile.Close() |
| 133 | + |
| 134 | + if _, err = fw.Write(content); err != nil { |
| 135 | + return fmt.Errorf("error writing content to zip for %s: %w", filename, err) |
| 136 | + } |
| 137 | + |
| 138 | + if err = os.Remove(filename); err != nil { |
| 139 | + return fmt.Errorf("error removing original file %s: %w", filename, err) |
| 140 | + } |
| 141 | + |
| 142 | + return nil |
| 143 | +} |
| 144 | + |
| 145 | +func writeFile(buffer *bytes.Buffer, filename string) error { |
| 146 | + outFile, err := os.Create(filename) |
| 147 | + if err != nil { |
| 148 | + return fmt.Errorf("error creating output file %s: %w", filename, err) |
| 149 | + } |
| 150 | + defer func() { |
| 151 | + _ = outFile.Close() |
| 152 | + }() |
| 153 | + |
| 154 | + if _, err = buffer.WriteTo(outFile); err != nil { |
| 155 | + return fmt.Errorf("error writing data to file %s: %w", filename, err) |
| 156 | + } |
| 157 | + |
| 158 | + return nil |
133 | 159 | }
|
0 commit comments