go - 在没有根文件夹的文件夹中压缩内容

标签 go

我想将内容中的一些目录压缩到 zip 文件中

例如假设我有这个目录结构

dir1
  file1.html
  file2.go

现在我想将它压缩到正在运行的 dir1.zip

当我提取它时,我得到了相同的结构...... 我想压缩里面的内容,当我解压它时,我得到里面的文件,解压后没有 `dir1' 文件夹作为根目录

file1.html
file2.go

我试着用这段代码来尝试路径,但它不起作用, 知道我在这里想念什么吗?

我试过了

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
}



dir.Zipit("path/dir1" +"/", "test"+".zip")

或者也许在 GO 中有更简单的方法来实现这一点?

最佳答案

假设您按如下方式调用您的函数:

Zipit("dir1/", "dir1.zip") 

您需要做的就是删除添加到存档文件名中的 baseDir

您当前有以下代码:

if baseDir != "" {
        header.Name = filepath.Join(baseDir, strings.TrimPrefix(path, source))
}

baseDir 这里是dir1

简单地省略 baseDir(但要保留前缀):

header.Name = strings.TrimPrefix(path, source)

这与 Unzip artifacts with different name 非常相似您需要做的就是根据需要修改 header.Name 。听起来您需要检查各种 filepath 函数以了解它们如何帮助您。

关于go - 在没有根文件夹的文件夹中压缩内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48751091/

相关文章:

go - Protobuf、Go 和私有(private)字段

go - 如何在 Go 中从用户名切换用户?

go - 在 Jenkins 中构建的路径名不正确

go - 使用telegraf input.logparser.grok时用于过滤字符串的自定义模式

go - 如何保存 GRPC 流以供重用

Golang嵌套类在函数内

Golang native http 客户端卡在特定 URI 上

go - Cobra MarkPersistentFlagRequired 不适用于 Root

go - 如何将 exec() 与输入参数一起使用?

http - Golang http.PostParam 未在响应中显示所有 Cookie