我使用以下代码压缩整个文件夹,我看到了结果,即创建的zip工件,现在我想用mac zip应用程序解压缩,我收到以下错误
我用来压缩这个文件夹的代码是: 我想念的是什么?或者在Golang中有更好的方法吗?
func zipit(source, target string) error {
zipfile, err := os.Create(target)
if err != nil {
return err
}
defer zipfile.Close()
archive := zip.NewWriter(zipfile)
defer archive.Close()
info, err := os.Stat(source)
if err != nil {
return nil
}
var baseDir string
if info.IsDir() {
baseDir = filepath.Base(source)
}
filepath.Walk(source, func(path string, info os.FileInfo, err error) error {
if err != nil {
return err
}
header, err := zip.FileInfoHeader(info)
if err != nil {
return err
}
if baseDir != "" {
header.Name = filepath.Join(baseDir, strings.TrimPrefix(path, source))
}
if info.IsDir() {
header.Name += "/"
} else {
header.Method = zip.Deflate
}
writer, err := archive.CreateHeader(header)
if err != nil {
return err
}
if info.IsDir() {
return nil
}
file, err := os.Open(path)
if err != nil {
return err
}
defer file.Close()
_, err = io.Copy(writer, file)
return err
})
return err
}
答案 0 :(得分:0)
由于命令行工具的重新实现速度要慢得多,因此最好只使用exec.Command
。创建存档后,您可以读取存档并将其发送到您喜欢的位置。
func main() {
pwd := os.Getenv("PWD")
dest := pwd + "/testdir.zip"
src := pwd + "/testdir"
err := Zip(src, dest)
if err != nil {
log.Fatal(err)
}
}
func Zip(src, dest string) error {
zipper := exec.Command("zip", "-rj", dest, src)
fmt.Println(zipper.Args)
err := zipper.Run()
if err != nil {
return err
}
return nil
}
注意:根据您的操作系统,这可能会有所不同。这在OSX上运行。