压缩代码整个文件夹无法解压缩

时间:2018-02-01 20:21:18

标签: go

我使用以下代码压缩整个文件夹,我看到了结果,即创建的zip工件,现在我想用mac zip应用程序解压缩,我收到以下错误

enter image description here 我用来压缩这个文件夹的代码是: 我想念的是什么?或者在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
}

1 个答案:

答案 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上运行。