func ZipPathWithFolders(sourcePath string) error { zipFile, err := os.Create("temp.zip") if err != nil { return err } defer zipFile.Close() zipWriter := zip.NewWriter(zipFile) defer zipWriter.Close() // 检查 sourcePath 是否是目录 fileInfo, err := os.Stat(sourcePath) if err == nil && fileInfo.IsDir() { // 如果是目录,遍历目录下的文件和子目录 err = filepath.Walk(sourcePath, func(filePath string, fileInfo os.FileInfo, err error) error { if err != nil { return err } // 获取相对路径 relativePath, err := filepath.Rel(sourcePath, filePath) if err != nil { return err } // 替换斜杠为正斜杠 relativePath = filepath.ToSlash(relativePath) // 创建压缩文件头 header, err := zip.FileInfoHeader(fileInfo) if err != nil { return err } header.Name = relativePath if fileInfo.IsDir() { header.Name += "/" } else { header.Method = zip.Deflate } // 写入文件头到压缩包 writer, err := zipWriter.CreateHeader(header) if err != nil { return err } if !fileInfo.IsDir() { // 打开源文件 file, err := os.Open(filePath) if err != nil { return err } defer file.Close() // 写入文件内容到压缩包 _, err = io.Copy(writer, file) if err != nil { return err } } return nil }) } else { // 如果是文件,直接将文件添加到压缩包中 relativePath := filepath.Base(sourcePath) // 创建压缩文件头 header, err := zip.FileInfoHeader(fileInfo) if err != nil { return err } header.Name = relativePath header.Method = zip.Deflate // 写入文件头到压缩包 writer, err := zipWriter.CreateHeader(header) if err != nil { return err } // 打开源文件 file, err := os.Open(sourcePath) if err != nil { return err } defer file.Close() // 写入文件内容到压缩包 _, err = io.Copy(writer, file) if err != nil { return err } } return nil }
golang直接压缩文件夹或者文件
最新推荐文章于 2024-06-03 09:20:44 发布