如何使用archiver归档时排除基础目录?求Go语言解决方案
嘿,我刚好碰到过一模一样的需求!archiver确实没直接提供“排除基础目录”的开关,但咱们可以换个思路绕过这个问题,另外也给你推荐几个Go里其他好用的归档方案~
用archiver实现“只压缩目录内内容”的方法
其实核心就是不直接压缩整个目录,而是遍历目录里的所有文件/子目录,逐个添加到归档中,这样就能避免把父文件夹打包进去。给你改一下代码示例:
package main import ( "log" "os" "path/filepath" "github.com/mholt/archiver/v3" ) func main() { targetDir := "./your-target-dir" // 替换成你的目标目录 outputZip := "result.zip" // 输出的压缩包名称 // 初始化zip归档实例 zipArchiver := archiver.NewZip() defer zipArchiver.Close() // 创建输出文件 outFile, err := os.Create(outputZip) if err != nil { log.Fatalf("创建输出文件失败: %v", err) } defer outFile.Close() zipArchiver.SetOutput(outFile) // 遍历目标目录下的所有内容 err = filepath.Walk(targetDir, func(path string, info os.FileInfo, err error) error { if err != nil { return err } // 跳过目标目录本身,避免把父文件夹加进归档 if path == targetDir { return nil } // 计算文件在归档内的相对路径(去掉目标目录的前缀) relPath, err := filepath.Rel(targetDir, path) if err != nil { return err } // 将文件/目录添加到归档,指定归档内的路径为相对路径 return zipArchiver.Add(path, relPath) }) if err != nil { log.Fatalf("遍历目录失败: %v", err) } // 完成归档的收尾工作 if err := zipArchiver.Finalize(); err != nil { log.Fatalf("归档完成失败: %v", err) } log.Println("压缩完成!") }
这段代码的逻辑很清晰:通过filepath.Walk遍历目标目录,跳过目录本身,然后把每个文件/子目录以相对路径的形式添加到归档里,这样压缩包里就只有目录内的内容,不会包含父文件夹了。
Go里的其他优质归档方案
如果archiver用着不顺手,还有几个不错的选择:
1. 标准库archive/zip
完全不需要第三方依赖,灵活性极高,适合对依赖体积有要求的场景。示例代码:
package main import ( "archive/zip" "io" "log" "os" "path/filepath" ) func main() { targetDir := "./your-target-dir" outputZip := "result.zip" // 创建并打开zip文件 zipFile, err := os.Create(outputZip) if err != nil { log.Fatalf("创建zip文件失败: %v", err) } defer zipFile.Close() zipWriter := zip.NewWriter(zipFile) defer zipWriter.Close() // 遍历目录并添加内容 err = filepath.Walk(targetDir, func(path string, info os.FileInfo, err error) error { if err != nil { return err } if path == targetDir { return nil } relPath, err := filepath.Rel(targetDir, path) if err != nil { return err } // 处理目录 if info.IsDir() { _, err := zipWriter.Create(relPath + "/") return err } // 处理文件 file, err := os.Open(path) if err != nil { return err } defer file.Close() zipEntry, err := zipWriter.Create(relPath) if err != nil { return err } _, err = io.Copy(zipEntry, file) return err }) if err != nil { log.Fatalf("归档失败: %v", err) } log.Println("标准库压缩完成!") }
2. klauspost/compress
这个库的压缩/解压性能比标准库高很多,尤其适合处理大文件或者大量文件的场景,用法和标准库类似,但效率更高。你只需要把标准库的archive/zip替换成github.com/klauspost/compress/zip即可,代码逻辑基本一致。
内容的提问来源于stack exchange,提问作者user8557463
相关产品推荐
相关产品推荐

