在golang中递归压缩目录

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在golang中递归压缩目录相关的知识,希望对你有一定的参考价值。

我基本上想在Golang中实现这些命令:

cd somedir ; zip -r ../zipped.zip . * ; cd ..

我正在尝试压缩父目录中的文件夹和文件,而不包括父目录。这篇文章是类似的:

https://askubuntu.com/questions/521011/zip-an-archive-without-including-parent-directory

答案

“我怎么递归拉链Golang”

像这样......

package rzip

import (
    "archive/zip"
    "io"
    "os"
    "path/filepath"
    "strings"
)

func RecursiveZip(pathToZip, destinationPath string) error {
    destinationFile, err := os.Create(destinationPath)
    if err != nil {
        return err
    }
    myZip := zip.NewWriter(destinationFile)
    err = filepath.Walk(pathToZip, func(filePath string, info os.FileInfo, err error) error {
        if info.IsDir() {
            return nil
        }
        if err != nil {
            return err
        }
        relPath := strings.TrimPrefix(filePath, filepath.Dir(pathToZip))
        zipFile, err := myZip.Create(relPath)
        if err != nil {
            return err
        }
        fsFile, err := os.Open(filePath)
        if err != nil {
            return err
        }
        _, err = io.Copy(zipFile, fsFile)
        if err != nil {
            return err
        }
        return nil
    })
    if err != nil {
        return err
    }
    err = myZip.Close()
    if err != nil {
        return err
    }
    return nil
}

至于docx文件和您的实现的问题,如果没有能够看到您的代码,很难看出问题可能是什么。

编辑:

要创建包含同一目录中所有文件的zip,只需更改在存档中创建的文件的路径即可。

    relPath := strings.TrimPrefix(filePath, filepath.Dir(pathToZip))
    zipFile, err := myZip.Create(relPath)

     flatPath := filepath.Base(pathToZip)
     zipFile, err := myZip.Create(flatPath)

要维护目录结构,但省略根目录

     relPath := strings.TrimPrefix(filePath, pathToZip)
     zipFile, err := myZip.Create(relPath)

干杯,

标记

以上是关于在golang中递归压缩目录的主要内容,如果未能解决你的问题,请参考以下文章

golang zip 压缩,解压(含目录文件)

golang代码片段(摘抄)

golang goroutine例子[golang并发代码片段]

golang 将mp3 / flac文件转换为aac,递归读取给定的基本目录,在工作池中使用3个goroutine。

Golang 递归获取目录下所有文件

Golang zip 压缩与解压