From 71340f46506d46a0b9e574887a6425a653e7b05e Mon Sep 17 00:00:00 2001 From: zengwei2000 <102871671+zengwei2000@users.noreply.github.com> Date: Sun, 25 Jun 2023 09:57:38 +0000 Subject: [PATCH] Optimizing the CompressDir function Now, the content of each file is no longer fully read into memory, but directly copied into a zip file through io. Copy(). Before the loop, we created the target file and reused the file handle in the loop, thereby reducing disk write operations. Finally, during export, we use the defer statement to release resources and ensure that these resources are properly closed before the program exits --- utils/fileutil/filetutil.go | 42 ++++++++++++++++++++----------------- 1 file changed, 23 insertions(+), 19 deletions(-) diff --git a/utils/fileutil/filetutil.go b/utils/fileutil/filetutil.go index f126b66..5b69cc4 100644 --- a/utils/fileutil/filetutil.go +++ b/utils/fileutil/filetutil.go @@ -139,38 +139,42 @@ func CompressDir(dir string) error { if err != nil { return err } - b := new(bytes.Buffer) - zw := zip.NewWriter(b) + + outFileName := fmt.Sprintf("%s.zip", dir) + outFilePath := filepath.Join(dir, outFileName) + + outFile, err := os.Create(outFilePath) + if err != nil { + return err + } + defer outFile.Close() + + zw := zip.NewWriter(outFile) + defer zw.Close() + for _, f := range files { fw, err := zw.Create(f.Name()) if err != nil { return err } - name := path.Join(dir, f.Name()) - content, err := os.ReadFile(name) + + contentPath := filepath.Join(dir, f.Name()) + contentFile, err := os.Open(contentPath) if err != nil { return err } - _, err = fw.Write(content) + defer contentFile.Close() + + _, err = io.Copy(fw, contentFile) if err != nil { return err } - err = os.Remove(name) + + err = os.Remove(contentPath) if err != nil { return err } } - if err := zw.Close(); err != nil { - return err - } - filename := filepath.Join(dir, fmt.Sprintf("%s.zip", dir)) - outFile, err := os.Create(filepath.Clean(filename)) - if err != nil { - return err - } - _, err = b.WriteTo(outFile) - if err != nil { - return err - } - return outFile.Close() + + return nil }