go - 递归压缩golang中的目录

标签 go zip

我基本上想在 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)

干杯,

标记

关于go - 递归压缩golang中的目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49057032/

相关文章:

Golang Fprint* f 代表什么

select - 从非 chan 类型 time.Duration 接收

linux - zip 在终端中有效,但在脚本内无效?

android - 如何将两个具有相同文件名的文件添加到单个 zip 存档文件中?

linux - 我如何在 linux 上制作一个 zip 文件?

json - 如何将 JSON 解码为接口(interface)数组并使用

Goland:如何使用自定义 modfile 而不是 go.mod?

go - 在 CockroachDB 中,批处理和事务如何交互?

c++ - 将 Zip 文件夹中的文件拖放到我的窗口中

macos - 使用 `zip`命令压缩文件时如何忽略.DS_Store文件?